久久一区二区中文字幕_日韩人体视频_国产影视一区_久久爱www.

南京軟件定制開發

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

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
返回頂部
久久一区二区中文字幕_日韩人体视频_国产影视一区_久久爱www.
欧美年轻男男videosbes| 91麻豆精东视频| 93久久精品日日躁夜夜躁欧美| 亚洲日本免费电影| 日韩免费看的电影| 91在线免费播放| 免费观看一级欧美片| 国产午夜精品久久久久久久 | 精品国产麻豆免费人成网站| 91色porny蝌蚪| 韩国一区二区视频| 亚洲成人免费电影| 亚洲青青青在线视频| 欧美成va人片在线观看| 91豆麻精品91久久久久久| 经典三级在线一区| 亚洲午夜一二三区视频| 亚洲国产精品黑人久久久| 日韩亚洲电影在线| 欧美三级视频在线观看| 99久久久精品| 国产精品一区二区久久不卡 | 久久国产夜色精品鲁鲁99| 亚洲精品中文字幕乱码三区| 国产日韩精品一区二区三区在线| 91精品国产全国免费观看| 欧美视频第二页| 色94色欧美sute亚洲线路一ni | 日本强好片久久久久久aaa| 国产精品入口麻豆九色| 久久久国际精品| 日韩精品中文字幕一区| 欧美一区二区三区喷汁尤物| 欧美三级乱人伦电影| 色丁香久综合在线久综合在线观看| 成人理论电影网| 成人精品鲁一区一区二区| 国产精品综合一区二区| 激情伊人五月天久久综合| 精品在线播放午夜| 精品综合免费视频观看| 国产一区视频在线看| 精品一区二区三区久久| 美国三级日本三级久久99| 日韩在线一区二区| 天天av天天翘天天综合网色鬼国产| 亚洲愉拍自拍另类高清精品| 一区二区三区色| 亚洲与欧洲av电影| 午夜激情综合网| 五月激情综合婷婷| 免费的国产精品| 免费美女久久99| 国产一区二区网址| 成人一级片在线观看| 波多野结衣亚洲| 色婷婷久久99综合精品jk白丝| 国产**成人网毛片九色| 成人精品高清在线| 欧美专区日韩专区| 91精品国产高清一区二区三区蜜臀 | 欧美精品一区二区不卡| 久久久不卡网国产精品二区| 日本一区二区视频在线| 亚洲男帅同性gay1069| 天天综合网天天综合色| 国产在线播放一区三区四| 成人小视频在线观看| 欧美中文字幕亚洲一区二区va在线| 欧美精品久久一区| 久久久久88色偷偷免费 | 精品国产一区二区三区不卡 | 国产一区在线观看麻豆| 91麻豆免费看| 精品久久人人做人人爽| 亚洲欧美色图小说| 视频一区二区中文字幕| 成人免费高清在线| 制服.丝袜.亚洲.中文.综合| 久久综合九色欧美综合狠狠| 亚洲精品国产无套在线观| 精一区二区三区| 国产成人小视频| 色妞www精品视频| 欧美一二三四在线| 国产精品不卡视频| 一区二区不卡在线播放| 国产乱子伦视频一区二区三区| av成人免费在线| 日韩欧美一区二区不卡| 亚洲欧美电影院| 久久av中文字幕片| 成人高清在线视频| 欧美精品色综合| 亚洲天堂久久久久久久| 激情小说欧美图片| 在线免费视频一区二区| 国产清纯美女被跳蛋高潮一区二区久久w| 亚洲综合色自拍一区| 国内精品视频666| 欧美色图免费看| 久久久久久电影| 日韩成人一区二区三区在线观看| 91免费小视频| 亚洲欧洲精品一区二区三区| 午夜视黄欧洲亚洲| 99国产精品国产精品毛片| 精品99久久久久久| 亚洲国产成人精品视频| 91色porny| 国产精品国产三级国产三级人妇 | 国产精品久久久久久一区二区三区| 日韩av中文字幕一区二区三区| 成人精品国产免费网站| 日本一区二区三区久久久久久久久不| 裸体健美xxxx欧美裸体表演| 99热这里都是精品| 国产精品全国免费观看高清| 久草中文综合在线| 国产精品午夜免费| 麻豆国产欧美一区二区三区| 狠狠色综合日日| 成人禁用看黄a在线| 91精品国产综合久久国产大片| 亚洲美女免费视频| 一本大道久久a久久综合婷婷| 欧美在线观看一二区| 日韩欧美一级在线播放| 五月综合激情婷婷六月色窝| 国产精品18久久久久久久网站| 欧美一区二区精品在线| 日本欧美一区二区三区| 日本韩国视频一区二区| 亚洲日本一区二区| 懂色av中文一区二区三区| 中文字幕av免费专区久久| 国产在线精品免费av| 日韩欧美国产高清| 看片网站欧美日韩| 26uuu久久综合| 床上的激情91.| 国产日韩在线不卡| 欧美一级黄色大片| 久久这里只有精品视频网| 亚洲一级二级三级| 91在线国产福利| 亚洲免费观看高清完整版在线观看| 不卡一区中文字幕| 亚洲一区日韩精品中文字幕| 91国产免费观看| 奇米影视一区二区三区| 久久综合九色综合97_久久久| 国内精品嫩模私拍在线| 国产综合色在线视频区| 日韩美女一区二区三区四区| 韩日av一区二区| 中文字幕一区二区三| 欧美日韩五月天| 看片网站欧美日韩| 综合久久久久综合| 717成人午夜免费福利电影| 国产一区二区电影| 亚洲在线视频网站| 欧美r级在线观看| 91丨国产丨九色丨pron| 美腿丝袜亚洲一区| 中文字幕一区二区三区乱码在线| 欧美性大战久久久久久久 | 99精品视频免费在线观看| 婷婷一区二区三区| 国产视频一区二区三区在线观看| 一本大道久久a久久综合婷婷 | 久久国产综合精品| 亚洲免费av在线| 久久久午夜精品理论片中文字幕| 在线观看av一区| 国产成人8x视频一区二区| 亚洲已满18点击进入久久| 欧美精品一区二区三区很污很色的 | 视频一区在线播放| 亚洲色图制服诱惑 | 亚洲午夜免费视频| 欧美电视剧在线看免费| 99精品在线观看视频| 经典三级视频一区| 香蕉成人伊视频在线观看| 亚洲色图一区二区| 欧美激情一二三区| 欧美tk丨vk视频| 欧美精品色综合| 欧美午夜不卡视频| 91丨九色丨黑人外教| 国产aⅴ综合色| 国产一区二区三区蝌蚪| 久久精品免费观看| 美女免费视频一区| 久久成人精品无人区| 青草av.久久免费一区| 日本欧美一区二区| 青青草国产精品97视觉盛宴|