/// <summary>
/// 多线程读取消息队列示例
/// </summary>
class MultiThread
{
private System.Threading.Thread[] _ThreadPool; //线程池
MessageQueue<int> _MessageQueue = new MessageQueue<int>(10000); //初始化消息队列,队列最大长度为10000
/// <summary>
/// 线程工作函数
/// </summary>
private void Do()
{
while (true)
{
Console.WriteLine(string.Format("Message:{0} ThreadId:{1}",
_MessageQueue.Dequeue(), System.Threading.Thread.CurrentThread.ManagedThreadId));
}
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="threadCount">线程数量</param>
public MultiThread(int threadCount)
{
_ThreadPool = new System.Threading.Thread[threadCount];
for (int i = 0 ; i < _ThreadPool.Length; i++)
{
_ThreadPool[i] =
new System.Threading.Thread(new System.Threading.ThreadStart(Do));
_ThreadPool[i].IsBackground = true;
}
}
/// <summary>
/// 向消息队列插入20个数值
/// </summary>
public void Enqueue()
{
for (int msg = 0; msg < 20; msg++)
{
_MessageQueue.Enqueue(msg);
}
}
/// <summary>
/// 开始多线程读取消息队列
/// </summary>
public void Start()
{
for (int i = 0; i < _ThreadPool.Length; i++)
{
_ThreadPool[i].Start();
}
}
}
/// <summary>
/// 消息队列,实现线程安全的消息入队和出队
/// </summary>
class MessageQueue<T>
{
Queue<T> _MessageQueue = new Queue<T>();
System.Threading.Semaphore _Sema = new System.Threading.Semaphore(0, 1000000);
/// <summary>
/// 构造函数
/// </summary>
/// <param name="queueSize">消息队列的最大长度</param>
public MessageQueue(int queueSize)
{
_Sema = new System.Threading.Semaphore(0, queueSize);
}
/// <summary>
/// 入队,向队列插入一条消息,并将信号量加一
/// </summary>
/// <param name="value"></param>
public void Enqueue(T value)
{
lock (this)
{
_MessageQueue.Enqueue(value);
_Sema.Release(1);
}
}
/// <summary>
/// 出队,等待信号量
/// 从队列中取出一个消息
/// </summary>
/// <returns></returns>
public T Dequeue()
{
_Sema.WaitOne();
lock (this)
{
return _MessageQueue.Dequeue();
}
}
}
//主函数
class Program
{
static void Main(string[] args)
{
MultiThread multiThread = new MultiThread(10);
multiThread.Enqueue();
multiThread.Start();
}
}