110,570
社区成员
发帖
与我相关
我的任务
分享
class PublicDataArea
{
public static ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
}
class WorkGroup
{
private int data; //需要自增的数据
//类内部的线程,线程工作就是让数据自增,放入队列中
public Thread th;
//构造函数接受外部传来的 需要进行自增操作的数据
public WorkGroup(int orderNumber,int data)
{
this.data = data;
th = new Thread(WorkThread);
th.Name = "线程"+orderNumber.ToString()+"号";
th.IsBackground = true;
}
void WorkThread() //线程工作函数
{
while (true)
{
Work();
Thread.CurrentThread.Join(500);
}
}
void Work()
{
try
{
data += 2; //自增数据
//这里不清楚,多个线程同时往里面放数据的时候,不需要一些限制操作吗,还是说线程安全队列自身已经提供了。
PublicDataArea.queue.Enqueue(data); //放入队列
//输出一下哪个线程将数据放入了队列中,放入的时间 ,放入的什么数据
Console.WriteLine(th.Name+"数据放入队列中,放入时间:"+DateTime.Now.ToString()+" 放入的数据为:"+data);
Console.WriteLine();
}
catch
{
MessageBox.Show("数据错误");
}
}
class Program
{
public int p;
void FetchData()
{
try
{
//我对这句话的理解就是TryDequeue()这个函数,当队列中有数据,就返回true,将对头数据放到p上, 无数据直接返 false
//所以我觉得这句话的意思,,就是当队列中有数据的时候,就把数据放入p中,无数据直接返回false
if ( PublicDataArea.queue.TryDequeue(out p))
{
Console.WriteLine("当前 数据为: "+p + " 当前时间为:"+DateTime.Now.ToString());
Console.WriteLine();
}
else
{
Console.WriteLine("数据为空");
Console.WriteLine();
}
}
catch
{
MessageBox.Show("取数据时发生错误");
}
}
public void Method()
{
while (true)
{
FetchData();
// Thread.CurrentThread.Join(600);
}
}
static void Main(string[] args)
{
Program mc = new Program();
Thread td = new Thread(mc.Method);//定义一个专门从队列中取数据的线程
td.IsBackground = true;
td.Start();
WorkGroup work;
for (int i = 0,j=1; i < 50; i++,j+=10) //i 为线程的标识 ,j为需要自增的数据 目的就是看看多个线程同时访问时,有哪些线程
//能够访问到
{
work = new WorkGroup(i, j);
work.th.IsBackground = true;
work.th.Start();
work = null;
}
Console.ReadLine();
}
}
}