国产精品久久av_国产在线一区二区视频_欧美v亚洲v综合v国产v仙踪林_天天插天天色_亚洲精品久久久蜜桃_日韩一级网站_亚洲精品承认

南京軟件定制開發

南京傾心軟件歡迎您訪問本站

13605185909

新聞資訊

NEWS CENTER
欄目導航

南京軟件開發之AutoResetEvent使用介紹

發布時間:Mar 23, 2021         已有 人瀏覽

之前在博客園看到有位仁兄發表一篇關于AutoResetEvent介紹,看了下他寫的代碼,看上去沒什么問題,但仔細看還是能發現問題。下圖是這位仁兄代碼截圖。

仁兄博客地址:http://www.cnblogs.com/lzjsky/archive/2011/07/11/2102794.html

按照這種寫法自己試了下,運行起來并不是他這種結果(運行結果很隨機)。

原因有以下兩點:

1、支付線程與取書線程都屬于同級線程,運行先后順序是隨機的

2、在循環內部調用AutoResetEvent.Set(),不能確定子線程是否按順序執行,有可能主線程已經循環多次,而子線程可能才循環一次

修正

首先,要明白實驗的場景。還是引用這位仁兄的例子:“我去書店買書,當我選中一本書后我會去收費處付錢,付好錢后再去倉庫取書。這個順序不能顛倒,我作為主線程,收費處和倉庫做兩個輔助線程” 。

要實現上圖這種效果,得先確定好執行先后順序(上面已經說過):挑書-->收費-->取書-->完成

代碼編寫如下:

復制代碼
 1 class Program
 2     {
 3         static int _num = 0;
 4         //本例重點對象
 5         static AutoResetEvent _autoReset = new AutoResetEvent(false);
 6 
 7         static AutoResetEvent _autoReset0 = new AutoResetEvent(false);
 8         static AutoResetEvent _autoReset1 = new AutoResetEvent(false);
 9 
10         //static AutoResetEvent autoReset2 = new AutoResetEvent(false);
11         //static AutoResetEvent autoReset3 = new AutoResetEvent(false);
12 
13         //static object _payMoneyObj = new object();
14         //static object _getBookObj = new object();
15 
16         private static void ThreadPayMoneyProc()
17         {
18             while (true)
19             {
20                 //_autoReset.WaitOne();
21                 _autoReset0.WaitOne();
22                 //lock (_payMoneyObj)
23                 {
24                     Console.WriteLine(Thread.CurrentThread.Name + ",編號: " + _num);
25                     //通知主線程,錢已付完
26                     //_autoReset2.Set();
27                 }
28             }
29         }
30 
31         private static void TreadGetBookProc()
32         {
33             while (true)
34             {
35                 //_autoReset.WaitOne();
36                 _autoReset1.WaitOne();
37                 //lock (_getBookObj)
38                 {
39                     Console.WriteLine(Thread.CurrentThread.Name + ",編號: " + _num);
40                     //通知主線程,書已取走
41                     //_autoReset3.Set();
42                 }
43             }
44         }
45 
46 
47         static void Main(string[] args)
48         {
49             //本案例是通過AutoResetEvent來實現多線程同步
50             //購買書數量
51             const int num = 50;
52 
53             //付錢線程
54             Thread threadPayMoney = new Thread(new ThreadStart(ThreadPayMoneyProc));
55             threadPayMoney.Name = "付錢線程";
56             //取書線程
57             Thread threadGetBook = new Thread(new ThreadStart(TreadGetBookProc));
58             threadGetBook.Name = "取書線程";
59 
60             //開始執行線程
61             threadPayMoney.Start();
62             threadGetBook.Start();
63 
64             //主線程開始選書
65             Console.WriteLine("----------------主線程開始選書!------------------");
66             for (int i = 1; i <= num; i++)
67             {
68                 Console.WriteLine("主線程選書編號:" + i);
69                 _num = i;
70                 //_autoReset.Set();
71 
72                 //通知付錢線程
73                 _autoReset0.Set();
74                 //主線延時1ms執行(但不知道付錢線程這個過程需要多少時間)
75                 Thread.Sleep(1);
76                 //_autoReset2.WaitOne();
77 
78                 //付完錢后,通知取書線程
79                 _autoReset1.Set();
80                 //主線延時1ms執行(但不知道取書線程這個過程需要多少時間)
81                 Thread.Sleep(1);
82                 //_autoReset3.WaitOne();
83                 Console.WriteLine("-----------------------------------");
84             }
85 
86             Console.ReadKey();
87 
88 
89         }
90     }
復制代碼

運行結果如下圖:

這樣做,效果是出來了,但主線程不知道付費線程、取書線程執行需要多長時間。上例中給定的是1ms,但如果其中某個子線程超過了給定的休眠時間,主線會繼續往下執行,不會等待子線程處理完成。這樣就導致了買書編號與付錢和取書的編號不同步。也就混亂了。

這時可以使用AutoResetEvent這個對象。上例中已經使用這個對象。沒錯,還可以在繼續使用。

代碼如下圖:

復制代碼
 1 class Program
 2     {
 3         static int _num = 0;
 4         //本例重點對象
 5         static AutoResetEvent _autoReset = new AutoResetEvent(false);
 6 
 7         static AutoResetEvent _autoReset0 = new AutoResetEvent(false);
 8         static AutoResetEvent _autoReset1 = new AutoResetEvent(false);
 9 
10         static AutoResetEvent _autoReset2 = new AutoResetEvent(false);
11         static AutoResetEvent _autoReset3 = new AutoResetEvent(false);
12 
13         //static object _payMoneyObj = new object();
14         //static object _getBookObj = new object();
15 
16         private static void ThreadPayMoneyProc()
17         {
18             while (true)
19             {
20                 //_autoReset.WaitOne();
21                 _autoReset0.WaitOne();
22                 //lock (_payMoneyObj)
23                 {
24                     Console.WriteLine(Thread.CurrentThread.Name + ",編號: " + _num);
25                     //通知主線程,錢已付完成
26                     _autoReset2.Set();
27                 }
28             }
29         }
30 
31         private static void TreadGetBookProc()
32         {
33             while (true)
34             {
35                 //_autoReset.WaitOne();
36                 _autoReset1.WaitOne();
37                 //lock (_getBookObj)
38                 {
39                     Console.WriteLine(Thread.CurrentThread.Name + ",編號: " + _num);
40                     //通知主線程,書已取走
41                     _autoReset3.Set();
42                 }
43             }
44         }
45 
46 
47         static void Main(string[] args)
48         {
49             //本案例是通過AutoResetEvent來實現多線程同步
50             //購買書數量
51             const int num = 5;
52 
53             //付錢線程
54             Thread threadPayMoney = new Thread(new ThreadStart(ThreadPayMoneyProc));
55             threadPayMoney.Name = "付錢線程";
56             //取書線程
57             Thread threadGetBook = new Thread(new ThreadStart(TreadGetBookProc));
58             threadGetBook.Name = "取書線程";
59 
60             //開始執行線程
61             threadPayMoney.Start();
62             threadGetBook.Start();
63 
64             //主線程開始選書
65             Console.WriteLine("----------------主線程開始選書!------------------");
66             for (int i = 1; i <= num; i++)
67             {
68                 Console.WriteLine("主線程選書編號:" + i);
69                 _num = i;
70                 //_autoReset.Set();
71 
72                 //通知付錢線程
73                 _autoReset0.Set();
74                 //主線延時1ms執行(但不知道付錢線程這個過程需要多少時間)
75                 //Thread.Sleep(1);
76                 //等待付錢線程
77                 _autoReset2.WaitOne();
78 
79                 //付完錢后,通知取書線程
80                 _autoReset1.Set();
81                 //主線延時1ms執行(但不知道取書線程這個過程需要多少時間)
82                 //Thread.Sleep(1);
83                 //等待取書線程
84                 _autoReset3.WaitOne();
85                 Console.WriteLine("-----------------------------------");
86                 //完成后,繼續下一個任務處理
87             }
88 
89             Console.ReadKey();
90 
91 
92         }
93     }
復制代碼

運行結果如下圖:

運行結果和上面使用指定主線程休眠所運行結果是一樣的。但是,可以不用指定主線程休眠時間,也不需要指定。因為你沒法估計子線程所運行的時間,而且每次運行時間都不一樣。

后話

本例中, 買書場景其實有兩種編程結構(或者編程思想)。一種是本例中的,買書是主線程,而收銀臺(付錢線程)、倉庫(取書線程)。這兩個線程是一直存在的,一直跑著的。只要有書過來,這兩個線程就會執行。這可以聯系到現實中的收銀臺和倉庫。

第二種編程思想,買書是一個發起線程,然后開啟一個付款線程和取書線程。這時,買書線程(主線程)可以確定這兩個子線程什么時候執行完成。使用 線程對象.Join(),執行完后,主線程接著下步任務處理。

Copyright © 2020-2022 南京傾心軟件技術有限公司 版權所有     蘇ICP備2020070309號-1
QQ在線咨詢
13605185909
返回頂部
国产精品久久av_国产在线一区二区视频_欧美v亚洲v综合v国产v仙踪林_天天插天天色_亚洲精品久久久蜜桃_日韩一级网站_亚洲精品承认
人人狠狠综合久久亚洲| 日韩二区三区四区| 国产精品888| 中文字幕亚洲区| 精品欧美久久久| 在线观看一区二区精品视频| 国产在线不卡一区| 日本中文字幕不卡| 亚洲一二三四久久| 中文字幕日韩精品一区| 国产午夜久久久久| 久久久亚洲精品石原莉奈 | 亚洲美女精品一区| 国产精品免费久久久久| 精品国产一区二区三区忘忧草 | 国产精品一区二区在线观看不卡 | 理论电影国产精品| 丝袜国产日韩另类美女| 亚洲黄色在线视频| 亚洲女子a中天字幕| 国产精品国模大尺度视频| 国产亚洲一区二区在线观看| 2欧美一区二区三区在线观看视频| 欧美日韩国产精选| 欧美高清视频在线高清观看mv色露露十八 | 久久一夜天堂av一区二区三区| 欧美丰满一区二区免费视频| 欧美日本在线观看| 91超碰这里只有精品国产| 欧美午夜影院一区| 91国产视频在线观看| 在线亚洲+欧美+日本专区| 在线观看视频91| 欧美高清hd18日本| 亚洲精品在线免费播放| 久久久噜噜噜久久人人看 | 视频一区二区不卡| 蜜臀av性久久久久蜜臀aⅴ流畅| 日本成人中文字幕| 国产乱一区二区| 国产99久久久国产精品免费看 | 一本色道久久综合亚洲91| 欧美性生活影院| 3d成人动漫网站| 久久先锋影音av鲁色资源| 国产精品久久久久久久午夜片 | 91亚洲精品久久久蜜桃| 欧美伊人精品成人久久综合97| 欧美精品一二三区| 精品少妇一区二区三区视频免付费| 久久在线观看免费| 日韩毛片高清在线播放| 视频一区二区不卡| www.在线欧美| 欧美精品一卡两卡| 国产日韩欧美a| 亚洲午夜私人影院| 国产露脸91国语对白| 色哟哟日韩精品| 日韩一区二区中文字幕| 国产精品久久久久精k8| 同产精品九九九| 国产91露脸合集magnet| 欧美日韩亚洲综合一区二区三区 | 欧美羞羞免费网站| 久久亚洲综合色| 亚洲r级在线视频| 国产999精品久久久久久绿帽| 欧美日韩一区二区三区四区 | 制服丝袜中文字幕亚洲| 国产精品剧情在线亚洲| 日本少妇一区二区| 色网站国产精品| 久久久久久久久伊人| 一区二区三区四区av| 国产成人av一区| av一区二区三区四区| 91精品在线麻豆| 有码一区二区三区| 成人免费精品视频| 欧美成人aa大片| 亚洲午夜国产一区99re久久| 成人午夜电影小说| 精品福利二区三区| 视频在线观看91| 在线视频一区二区免费| 中文字幕va一区二区三区| 国内精品久久久久影院色 | 欧美本精品男人aⅴ天堂| 亚洲日本丝袜连裤袜办公室| 国产乱码精品一品二品| 日韩欧美123| 午夜精品久久久久久久久久久| 91麻豆精品在线观看| 国产精品丝袜一区| 国产剧情一区二区| 久久免费美女视频| 国产美女娇喘av呻吟久久| 日韩欧美亚洲另类制服综合在线| 亚洲国产视频一区| 日本久久一区二区三区| 尤物在线观看一区| 99国产精品视频免费观看| 中文乱码免费一区二区| gogo大胆日本视频一区| 日本一区二区三区四区在线视频| 久久电影网电视剧免费观看| 欧美精品一区二区三区久久久 | 国产精品日日摸夜夜摸av| 国产电影精品久久禁18| 中文字幕免费观看一区| 成人午夜看片网址| 国产精品久久久久久久久久免费看 | 日韩精品中文字幕在线一区| 日本在线不卡一区| 欧美一区二区三区日韩| 日韩电影免费一区| 欧美一区二区免费视频| 日韩经典一区二区| 日韩精品中文字幕一区 | 亚洲另类中文字| 欧美精品aⅴ在线视频| 日韩va亚洲va欧美va久久| 精品少妇一区二区三区免费观看| 欧美日韩一区二区三区四区五区| 色综合天天综合| 国产精品久久久久久久久免费相片| 韩国v欧美v日本v亚洲v| 2欧美一区二区三区在线观看视频| 黄页视频在线91| 日本一区二区三区电影| 99久久综合色| 午夜成人免费视频| 欧美大片在线观看一区| 粉嫩高潮美女一区二区三区| 亚洲精品免费视频| 在线综合亚洲欧美在线视频| 国产精品一区二区在线观看不卡| 日韩一区在线看| 91精品福利在线一区二区三区| 国产美女精品在线| 亚洲一区二区av在线| 国产午夜精品一区二区三区嫩草 | 欧美精品在线观看播放| 精品一区二区三区视频| 亚洲精品福利视频网站| 精品国产一区二区精华| 91九色02白丝porn| 国产精品综合网| 五月天欧美精品| 国产精品三级在线观看| 日韩久久免费av| 色婷婷久久综合| 日日摸夜夜添夜夜添亚洲女人| 日本一区二区不卡视频| 日韩西西人体444www| 另类人妖一区二区av| 亚洲精品第一国产综合野| 欧美国产日产图区| 精品国产一区二区亚洲人成毛片| 欧美体内she精高潮| 国产99久久久国产精品潘金| 青青草伊人久久| 亚洲图片有声小说| 亚洲人成7777| 亚洲国产岛国毛片在线| 日韩精品影音先锋| 欧美网站一区二区| 波多野结衣中文字幕一区 | 日本不卡视频在线| 亚洲最大成人综合| 国产精品卡一卡二| 中文字幕免费在线观看视频一区| 精品国产乱码久久久久久牛牛| 欧美乱妇一区二区三区不卡视频| 99视频有精品| av在线不卡观看免费观看| 国产乱理伦片在线观看夜一区 | 国产.欧美.日韩| 狠狠色丁香婷婷综合| 免费亚洲电影在线| 蜜桃久久av一区| 日本在线不卡视频一二三区| 亚洲国产精品一区二区www | 日本欧美一区二区在线观看| 亚洲精品乱码久久久久久久久 | 亚洲自拍偷拍综合| 亚洲伦在线观看| 亚洲精品免费播放| 亚洲一区二区不卡免费| 亚洲美腿欧美偷拍| 一区二区三区美女视频| 一区二区三区中文字幕精品精品| 亚洲人亚洲人成电影网站色| 亚洲三级电影网站| 亚洲国产一二三| 轻轻草成人在线| 国产一区二区精品久久91| 国产一区二区调教| 国产iv一区二区三区|