zoukankan      html  css  js  c++  java
  • 常用开固定个数多线程的处理方法

     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);
    }
    } }
  • 相关阅读:
    蚂蚁金服井贤栋:用技术联手金融机构,形成服务小微的生态合力
    蚂蚁金服 Service Mesh 渐进式迁移方案|Service Mesh Meetup 实录
    蚂蚁金服“定损宝”现身AI顶级会议NeurIPS
    报名 | 蚂蚁金服ATEC科技大会 · 上海:数字金融新原力
    前沿 | 中国中小银行都是如何展开数字化转型的?
    盘点:2018年双11背后的蚂蚁核心技术
    构筑敏捷能力中心,打造下一代数字银行“操作系统”!
    客户故事:4家银行如何打造新一代移动金融中心
    干货 | 金融级互联网产品持续交付的挑战与应对
    性能跃升50%!解密自主研发的金融级分布式关系数据库OceanBase 2.0
  • 原文地址:https://www.cnblogs.com/360qq/p/Thread.html
Copyright © 2011-2022 走看看