博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常用开固定个数多线程的处理方法
阅读量:5226 次
发布时间:2019-06-14

本文共 3431 字,大约阅读时间需要 11 分钟。

 

private void button3_Click(object sender, EventArgs e)        {            Thread tCreater = new Thread(new ThreadStart(Creater));            tCreater.Start();            Thread tC1 = new Thread(new ThreadStart(ConsumeBill));            tC1.Name = "tc1";            tC1.Start();            Thread tC2 = new Thread(new ThreadStart(ConsumeBill));            tC2.Name = "tc2";            tC2.Start();            Thread tC3 = new Thread(new ThreadStart(ConsumeBill));            tC3.Name = "tc3";            tC3.Start();                }        DataTable dt = null;        public static object syncObj = new object();        public void Creater()        {            while (true)            {                if (dt == null || dt.Rows.Count == 0)                {                    Console.WriteLine("生产者线程进入");                    Monitor.Enter(syncObj);                                                        Console.WriteLine("生产者开始生产产品");                    RecCityComplexPayBillApplyBll bll = new RecCityComplexPayBillApplyBll();                    dt = bll.TableBySearch();                    Console.WriteLine("生产者线程通知消费者继续");                    Monitor.Pulse(syncObj);                    Console.WriteLine("生产者线程进等待");                    Monitor.Wait(syncObj);                    Monitor.Exit(syncObj);                }            }        }        public static object syncConsume = new object();        public void ConsumeBill()        {            while (true)            {                if (dt != null && dt.Rows.Count > 0)                {                    Monitor.Enter(syncConsume);                    Console.WriteLine("消费者者线程进入:" + Thread.CurrentThread.Name);                    if (dt != null && dt.Rows.Count > 0)                    {                        Console.WriteLine("消费者取出产品:" + Thread.CurrentThread.Name);                        DataRow dr = dt.Rows[0];                        RecCityComplexPayBillApplyInfo info = new RecCityComplexPayBillApplyInfo();                        info.BaseImportByRow(dr);                        dt.Rows.Remove(dr);                        Console.WriteLine("消费者线程退出" + Thread.CurrentThread.Name);                         if(dt.Rows.Count>0)                         {
                 Monitor.Exit(syncConsume); //自行实现process处理,先释放资源,然后再处理,一边其他线程能继续处理其他记录    process(info);    } else {
//自行实现process处理, process(info); Monitor.Enter(syncObj);                         //通知生产者线程                             Console.WriteLine("消费者者线程通知生产者产品:" + Thread.CurrentThread.Name);                             Monitor.Pulse(syncObj); //消费者独占消费资源并等待处理线程处理记录,以便所有线程都能处理完成(偶尔会出现处理未结束,生产者已经开始,但能最大限度的保证重复处理)                    //所有消费者线程等待                             Console.WriteLine("消费者者线程等待生产者产生产品wait:" + Thread.CurrentThread.Name);                             Monitor.Wait(syncObj);                             Console.WriteLine("消费者者线程开始执行:" + Thread.CurrentThread.Name);                             Monitor.Exit(syncObj);                    Monitor.Exit(syncConsume); } } else {
//系统不会进到该出  Monitor.Exit(syncConsume); } } }

 

转载于:https://www.cnblogs.com/360qq/p/Thread.html

你可能感兴趣的文章
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>
python使用chardet判断字符串编码,超简单的代码
查看>>
[NOIP2012TG] 洛谷 P1080 国王游戏
查看>>
使用C#交互快速生成代码!
查看>>
洛谷P4315 月下“毛景树” 边权树剖+双标记
查看>>
UVA11374 Airport Express
查看>>
P1373 小a和uim之大逃离 四维dp,维护差值
查看>>
NOIP2015 运输计划 树上差分+树剖
查看>>
P3950 部落冲突 树链剖分
查看>>
有道词典_每日一句_2019/07
查看>>
读书_2019年
查看>>
读书汇总贴
查看>>
微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
查看>>