本文转自:http://bbs.csdn.net/topics/210023993
要求:一:2个线程往队列写数据,1个线程从队列里面读数据 读取的是最后一个线程写的数据;(在控制台输出读和写的数据)
二:能区分是哪个线程写的数据
三:用exit命令结束线程
实现方法:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
//堆栈是后进先出的
static System.Collections.Stack stack = new System.Collections.Stack();
//信号量控制线程
static System.Threading.ManualResetEvent obj = new System.Threading.ManualResetEvent(false);
//写入的对象
public class Data
{
public Guid ID = Guid.NewGuid();
public string ThreadName = System.Threading.Thread.CurrentThread.Name;
public override string ToString()
{
return string.Format("{0}生成的{1}", ThreadName, ID);
}
}
static void Main(string[] args)
{
obj.Reset();
System.Threading.Thread t1 = new System.Threading.Thread(new System.Threading.ThreadStart(wirteData));
System.Threading.Thread t2 = new System.Threading.Thread(new System.Threading.ThreadStart(wirteData));
System.Threading.Thread t3 = new System.Threading.Thread(new System.Threading.ThreadStart(readData));
t1.Name = "w1";
t2.Name = "w2";
t3.Name = "r1";
t1.Start();
t2.Start();
t3.Start();
//等待输入
if (Console.ReadLine().ToLower() == "exit")
{
obj.Set();
Console.WriteLine("退出!");
}
}
//
static Random rand = new Random(100);
private static void wirteData()
{
//线程等待时间
int i = rand.Next(3000, 4000);
while (obj.WaitOne(i, false) == false)
{
Data data = new Data();
lock (stack)
{
stack.Push(data);
}
Console.WriteLine("写入:"+data.ToString());
}
Console.WriteLine("退出!");
}
private static void readData()
{
int i = rand.Next(2000, 3000);
while (obj.WaitOne(i, false) == false)
{
lock (stack)
{
if (stack.Count > 0)
{
Data data = stack.Pop() as Data;
Console.WriteLine("读取:" + data.ToString());
}
else
{
Console.WriteLine("无数据!");
}
}
}
}
}
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册