双Queue交替使用(C#)
作者:PaulLeder 日期:2010-06-27
引用内容using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
class Program
{
static HandlerQueue queue1 = new HandlerQueue("queue1@@");
static HandlerQueue queue2 = new HandlerQueue("Queue2==");
static void Main(string[] args)
{
Thread tin = new Thread(DoEnQueue);
Thread tin1 = new Thread(DoEnQueue);
Thread tin2 = new Thread(DoEnQueue);
Thread tout = new Thread(new ThreadStart(DoDeQueue));
tin.Start(1000);
tin1.Start(100);
tin2.Start(10000);
tout.Start();
System.Console.ReadLine();
}
protected static void DoDeQueue()
{
while (true)
{
Data d = null;
HandlerQueue tem_queue = null;
queue1.Reset();
queue2.Reset();
if (!queue1.EnQueuing && queue1.Count > 0)
{
queue1.DeQueuing = true;
queue2.DeQueuing = false;
d = queue1.DeQueue();
tem_queue = queue1;
}
else if (!queue2.EnQueuing && queue2.Count > 0)
{
queue2.DeQueuing = true;
queue1.DeQueuing = false;
d = queue2.DeQueue();
tem_queue = queue2;
}
if (d != null)
{
//Logger.Write(Level.Info, string.Format("============[{0}]DeQueue:Id:{1},Name:{2}", tem_queue.QueueName, d.Id, d.Name));
System.Console.WriteLine(string.Format("{0}============[{1}]DeQueue:Id:{2},Name:{3}", DateTime.Now.Ticks, tem_queue.QueueName, d.Id, d.Name));
//Thread.Sleep(100);
}
else
{
Thread.Sleep(100);
}
}
}
protected static void DoEnQueue(object limit)
{
int maxCnt = 5;
while (true)
{
Random r = new Random();
int lt = Int32.Parse(limit.ToString());
int rr = r.Next(lt);
HandlerQueue tem_queue = null;
if (queue1.Count < maxCnt && !queue2.EnQueuing && !queue2.DeQueuing)
{
if (!queue1.EnQueuing)
{
queue1.Clear();
queue1.EnQueuing = true;
queue2.EnQueuing = false;
}
queue1.EnQueue(new Data(rr, rr.ToString()));
tem_queue = queue1;
//Logger.Write(Level.Info, string.Format("条件1"));
}
else if (queue1.Count >= maxCnt || (!queue2.DeQueuing && queue2.Count <= maxCnt))
{
if (!queue2.EnQueuing)
{
queue2.Clear();
queue2.EnQueuing = true;
queue1.EnQueuing = false;
}
queue2.EnQueue(new Data(rr, rr.ToString()));
tem_queue = queue2;
//Logger.Write(Level.Info, string.Format("条件2"));
}
else if (queue2.Count >= maxCnt || (!queue1.DeQueuing && queue1.Count <= maxCnt))
{
if (!queue1.EnQueuing)
{
queue1.Clear();
queue1.EnQueuing = true;
queue2.EnQueuing = false;
}
queue1.EnQueue(new Data(rr, rr.ToString()));
tem_queue = queue1;
//Logger.Write(Level.Info, string.Format("条件3"));
}
else
{
//Logger.Write(Level.Info, string.Format("Lost EnQueue,queue1:[EnQueuing:{0},DeQueuing:{1},Count:{2}],Queue2:[EnQueuing:{3},DeQueuing:{4},Count:{5}]", queue1.EnQueuing, queue1.DeQueuing, queue1.Count, queue2.EnQueuing, queue2.DeQueuing, queue2.Count));
System.Console.WriteLine(string.Format("Lost EnQueue,queue1:[EnQueuing:{0},DeQueuing:{1},Count:{2}],Queue2:[EnQueuing:{3},DeQueuing:{4},Count:{5}]", queue1.EnQueuing, queue1.DeQueuing, queue1.Count, queue2.EnQueuing, queue2.DeQueuing, queue2.Count));
}
try
{
//System.Console.WriteLine(string.Format("EnQueue:Id:{0},Name:{1}", rr, rr));
//Logger.Write(Level.Info, string.Format("[{0}]EnQueue:Id:{1},Name:{2}", tem_queue.QueueName, rr, rr));
System.Console.WriteLine(string.Format("{0}-[{1}]EnQueue:Id:{2},Name:{3}",DateTime.Now.Ticks, tem_queue.QueueName, rr, rr));
}
catch { }
Thread.Sleep(100);
}
}
}
public class HandlerQueue
{
private Queue<Data> queue = null;
private static volatile object o = new object();
private static volatile object o1 = new object();
private static volatile object oc = new object();
public string QueueName
{
get;
set;
}
public HandlerQueue(string queueName)
{
this.QueueName = queueName;
this.queue = new Queue<Data>();
this.EnQueuing = false;
this.DeQueuing = false;
}
/// <summary>
/// 进栈
/// </summary>
/// <param name="data"></param>
public void EnQueue(Data data)
{
lock (o)
{
queue.Enqueue(data);
}
}
/// <summary>
/// 出栈
/// </summary>
/// <returns></returns>
public Data DeQueue()
{
lock (o1)
{
if (queue.Count > 0)
{
return queue.Dequeue();
}
}
return null;
}
/// <summary>
/// 获得数量
/// </summary>
/// <returns></returns>
public int Count
{
get
{
return queue.Count;
}
}
/// <summary>
/// 清理Queue
/// </summary>
public void Clear()
{
queue.Clear();
}
/// <summary>
/// 是否在进栈
/// </summary>
public bool EnQueuing
{
get;
set;
}
/// <summary>
/// 是否在出栈
/// </summary>
public bool DeQueuing
{
get;
set;
}
/// <summary>
/// 重置
/// </summary>
public void Reset()
{
if (this.Count == 0)
{
this.DeQueuing = false;
}
}
}
public class Data
{
public int Id { get; set; }
public string Name { get; set; }
public Data()
{
}
public Data(int id, string name)
{
this.Id = id;
this.Name = name;
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
class Program
{
static HandlerQueue queue1 = new HandlerQueue("queue1@@");
static HandlerQueue queue2 = new HandlerQueue("Queue2==");
static void Main(string[] args)
{
Thread tin = new Thread(DoEnQueue);
Thread tin1 = new Thread(DoEnQueue);
Thread tin2 = new Thread(DoEnQueue);
Thread tout = new Thread(new ThreadStart(DoDeQueue));
tin.Start(1000);
tin1.Start(100);
tin2.Start(10000);
tout.Start();
System.Console.ReadLine();
}
protected static void DoDeQueue()
{
while (true)
{
Data d = null;
HandlerQueue tem_queue = null;
queue1.Reset();
queue2.Reset();
if (!queue1.EnQueuing && queue1.Count > 0)
{
queue1.DeQueuing = true;
queue2.DeQueuing = false;
d = queue1.DeQueue();
tem_queue = queue1;
}
else if (!queue2.EnQueuing && queue2.Count > 0)
{
queue2.DeQueuing = true;
queue1.DeQueuing = false;
d = queue2.DeQueue();
tem_queue = queue2;
}
if (d != null)
{
//Logger.Write(Level.Info, string.Format("============[{0}]DeQueue:Id:{1},Name:{2}", tem_queue.QueueName, d.Id, d.Name));
System.Console.WriteLine(string.Format("{0}============[{1}]DeQueue:Id:{2},Name:{3}", DateTime.Now.Ticks, tem_queue.QueueName, d.Id, d.Name));
//Thread.Sleep(100);
}
else
{
Thread.Sleep(100);
}
}
}
protected static void DoEnQueue(object limit)
{
int maxCnt = 5;
while (true)
{
Random r = new Random();
int lt = Int32.Parse(limit.ToString());
int rr = r.Next(lt);
HandlerQueue tem_queue = null;
if (queue1.Count < maxCnt && !queue2.EnQueuing && !queue2.DeQueuing)
{
if (!queue1.EnQueuing)
{
queue1.Clear();
queue1.EnQueuing = true;
queue2.EnQueuing = false;
}
queue1.EnQueue(new Data(rr, rr.ToString()));
tem_queue = queue1;
//Logger.Write(Level.Info, string.Format("条件1"));
}
else if (queue1.Count >= maxCnt || (!queue2.DeQueuing && queue2.Count <= maxCnt))
{
if (!queue2.EnQueuing)
{
queue2.Clear();
queue2.EnQueuing = true;
queue1.EnQueuing = false;
}
queue2.EnQueue(new Data(rr, rr.ToString()));
tem_queue = queue2;
//Logger.Write(Level.Info, string.Format("条件2"));
}
else if (queue2.Count >= maxCnt || (!queue1.DeQueuing && queue1.Count <= maxCnt))
{
if (!queue1.EnQueuing)
{
queue1.Clear();
queue1.EnQueuing = true;
queue2.EnQueuing = false;
}
queue1.EnQueue(new Data(rr, rr.ToString()));
tem_queue = queue1;
//Logger.Write(Level.Info, string.Format("条件3"));
}
else
{
//Logger.Write(Level.Info, string.Format("Lost EnQueue,queue1:[EnQueuing:{0},DeQueuing:{1},Count:{2}],Queue2:[EnQueuing:{3},DeQueuing:{4},Count:{5}]", queue1.EnQueuing, queue1.DeQueuing, queue1.Count, queue2.EnQueuing, queue2.DeQueuing, queue2.Count));
System.Console.WriteLine(string.Format("Lost EnQueue,queue1:[EnQueuing:{0},DeQueuing:{1},Count:{2}],Queue2:[EnQueuing:{3},DeQueuing:{4},Count:{5}]", queue1.EnQueuing, queue1.DeQueuing, queue1.Count, queue2.EnQueuing, queue2.DeQueuing, queue2.Count));
}
try
{
//System.Console.WriteLine(string.Format("EnQueue:Id:{0},Name:{1}", rr, rr));
//Logger.Write(Level.Info, string.Format("[{0}]EnQueue:Id:{1},Name:{2}", tem_queue.QueueName, rr, rr));
System.Console.WriteLine(string.Format("{0}-[{1}]EnQueue:Id:{2},Name:{3}",DateTime.Now.Ticks, tem_queue.QueueName, rr, rr));
}
catch { }
Thread.Sleep(100);
}
}
}
public class HandlerQueue
{
private Queue<Data> queue = null;
private static volatile object o = new object();
private static volatile object o1 = new object();
private static volatile object oc = new object();
public string QueueName
{
get;
set;
}
public HandlerQueue(string queueName)
{
this.QueueName = queueName;
this.queue = new Queue<Data>();
this.EnQueuing = false;
this.DeQueuing = false;
}
/// <summary>
/// 进栈
/// </summary>
/// <param name="data"></param>
public void EnQueue(Data data)
{
lock (o)
{
queue.Enqueue(data);
}
}
/// <summary>
/// 出栈
/// </summary>
/// <returns></returns>
public Data DeQueue()
{
lock (o1)
{
if (queue.Count > 0)
{
return queue.Dequeue();
}
}
return null;
}
/// <summary>
/// 获得数量
/// </summary>
/// <returns></returns>
public int Count
{
get
{
return queue.Count;
}
}
/// <summary>
/// 清理Queue
/// </summary>
public void Clear()
{
queue.Clear();
}
/// <summary>
/// 是否在进栈
/// </summary>
public bool EnQueuing
{
get;
set;
}
/// <summary>
/// 是否在出栈
/// </summary>
public bool DeQueuing
{
get;
set;
}
/// <summary>
/// 重置
/// </summary>
public void Reset()
{
if (this.Count == 0)
{
this.DeQueuing = false;
}
}
}
public class Data
{
public int Id { get; set; }
public string Name { get; set; }
public Data()
{
}
public Data(int id, string name)
{
this.Id = id;
this.Name = name;
}
}
工作机理就是线程1给其中一个Queue1推新数据,当Queue1满了,则线程1给Queue2填充数据,而线程二开始将Queue1的数据推出,交替使用Queue
评论: 0 | 引用: 0 | 查看次数: 92
发表评论
上一篇
下一篇

文章来自:
Tags:
相关日志:






