欧美一乱一性一交一视频_久久久99久久_另类天堂视频在线观看_免费观看久久av_欧美黑人xxxxx_国产精品久久久久一区二区三区_男男激情在线_亚洲视频在线免费观看_国产精品二区二区三区_在线观看麻豆视频_91小视频在线免费看_国产综合18久久久久久

南京軟件定制開發(fā)

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

13605185909

新聞資訊

NEWS CENTER
欄目導航

南京軟件開發(fā)之AutoResetEvent使用介紹

發(fā)布時間:Mar 23, 2021         已有 人瀏覽

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

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

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

原因有以下兩點:

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

2、在循環(huán)內(nèi)部調(diào)用AutoResetEvent.Set(),不能確定子線程是否按順序執(zhí)行,有可能主線程已經(jīng)循環(huán)多次,而子線程可能才循環(huán)一次

修正

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

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

代碼編寫如下:

復制代碼
 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來實現(xiàn)多線程同步
50             //購買書數(shù)量
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             //開始執(zhí)行線程
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執(zhí)行(但不知道付錢線程這個過程需要多少時間)
75                 Thread.Sleep(1);
76                 //_autoReset2.WaitOne();
77 
78                 //付完錢后,通知取書線程
79                 _autoReset1.Set();
80                 //主線延時1ms執(zhí)行(但不知道取書線程這個過程需要多少時間)
81                 Thread.Sleep(1);
82                 //_autoReset3.WaitOne();
83                 Console.WriteLine("-----------------------------------");
84             }
85 
86             Console.ReadKey();
87 
88 
89         }
90     }
復制代碼

運行結(jié)果如下圖:

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

這時可以使用AutoResetEvent這個對象。上例中已經(jīng)使用這個對象。沒錯,還可以在繼續(xù)使用。

代碼如下圖:

復制代碼
 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來實現(xiàn)多線程同步
50             //購買書數(shù)量
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             //開始執(zhí)行線程
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執(zhí)行(但不知道付錢線程這個過程需要多少時間)
75                 //Thread.Sleep(1);
76                 //等待付錢線程
77                 _autoReset2.WaitOne();
78 
79                 //付完錢后,通知取書線程
80                 _autoReset1.Set();
81                 //主線延時1ms執(zhí)行(但不知道取書線程這個過程需要多少時間)
82                 //Thread.Sleep(1);
83                 //等待取書線程
84                 _autoReset3.WaitOne();
85                 Console.WriteLine("-----------------------------------");
86                 //完成后,繼續(xù)下一個任務處理
87             }
88 
89             Console.ReadKey();
90 
91 
92         }
93     }
復制代碼

運行結(jié)果如下圖:

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

后話

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

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

Copyright © 2020-2022 南京傾心軟件技術(shù)有限公司 版權(quán)所有     蘇ICP備2020070309號-1
QQ在線咨詢
13605185909
返回頂部
欧美亚洲另类视频| 日本一区二区高清不卡| 国产欧美一区| 伊人一区二区三区| 国产美女扒开尿口久久久| 在线观看视频色潮| 成人在线丰满少妇av| 一本久久综合亚洲鲁鲁五月天| 国产日韩欧美影视| 都市激情一区| 视频一区视频二区中文字幕| 555夜色666亚洲国产免| 欧美一级二级三级九九九| 一本大道色婷婷在线| 国产自产v一区二区三区c| 超碰精品一区二区三区乱码| 妞干网在线观看| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 亚洲国产黄色片| 久久免费一级片| 欧美午夜网站| 亚洲一区中文在线| 91久久在线视频| 亚洲资源一区| 2020国产成人综合网| 91黄色8090| 你懂得网站在线| 国内成人自拍视频| 日本中文字幕久久看| 激情影院在线观看| 久久久精品tv| 国外成人在线视频网站| 99久久精品一区二区成人| 国产精品盗摄一区二区三区| 久久久久高清| 精品女人视频| 欧美日韩高清不卡| www日韩视频| 久久久久国产一区二区| 国内精品400部情侣激情| 免费成人黄色| 亚洲欧洲韩国日本视频| 亚洲精品视频一二三| 国产成人高清| 国产一区二区美女视频| 在线观看视频你懂的| 国产99精品国产| 91精品国产91久久久久青草| 亚洲精品tv| 制服丝袜亚洲网站| 嫩草影院永久入口| 国产ts人妖一区二区| 91久久精品美女| 视频一区中文字幕精品| 精品国产一区a| 一级片在线播放| 久久日韩精品一区二区五区| 久久久久久久久四区三区| 日本三级久久| 日韩中文字幕在线精品| 在线免费av导航| 欧美色播在线播放| 亚洲综合欧美激情| 国产91精品一区二区麻豆亚洲| 黄色小网站91| 欧美日韩导航| 久久激情视频免费观看| 日本高清在线观看视频| 亚洲国产三级在线| 一本久道综合色婷婷五月| 日韩av在线播放中文字幕| 成人欧美一区二区三区黑人| 牛牛影视久久网| 精品国产拍在线观看| 自拍一区在线观看| 精品福利一二区| 二区三区四区高清视频在线观看| 亚洲妇熟xx妇色黄| 超级碰碰视频| 欧美激情在线观看视频免费| 国产中文字幕乱人伦在线观看| 天堂影院一区二区| 国产伦精品一区二区三区高清| 色综合久久网| 日韩av电影手机在线观看| 久久久久亚洲精品中文字幕| 在线播放国产精品| 92久久精品| 亚洲丁香婷深爱综合| free性欧美hd另类精品| www.亚洲在线| 久久99久久99精品| 粉嫩一区二区三区在线看| 亚洲电影网站| 免费成人美女在线观看| 色一情一区二区三区四区 | 国产伊人精品在线| 精品国产乱码久久久久久果冻传媒 | 欧美大片91| 精品久久久999| 亚洲精品aaa| 欧美激情精品久久久久久蜜臀| 欧美天堂一区二区| 精品中文字幕视频| 日韩伦理一区二区三区| 日本乱人伦a精品| 欧美好骚综合网| 国产精品一区二| 青青青伊人色综合久久| 国产免费xxx| 99久免费精品视频在线观看| 国产精品免费观看久久| 国产精品美女久久久久高潮| 香蕉521av成人网| 一区二区三区日韩欧美精品 | 成人综合专区| 成人av蜜桃| 奇米精品一区二区三区在线观看| 视色,视色影院,视色影库,视色网| 国产成人免费av在线| 自慰无码一区二区三区| 中文字幕成人网| 波多野结衣av在线播放| 精品久久久久久久大神国产| аⅴ资源新版在线天堂| 欧美tk—视频vk| 成人不卡视频| 青青久久av北条麻妃海外网| 国内揄拍国内精品久久| 中文字幕一区二区三区最新| 久久久亚洲欧洲日产国码αv| 网址你懂得在线观看| 日韩欧美亚洲一区二区| 成人看片毛片免费播放器| 欧美在线视频网| 亚洲最大av| 激情五月六月婷婷| 一区二区在线观看不卡| 污片在线免费观看| 久久999免费视频| 国产精品mm| 久久免费一级片| 亚洲午夜精品17c| аⅴ资源天堂资源库在线| 韩国视频理论视频久久| 亚洲一区久久| 丰满少妇又爽又紧又丰满69| 日韩天堂在线观看| 精品视频国内| 国产日韩亚洲精品| 久久综合九色综合久久久精品综合| 最近97中文超碰在线| 日韩欧美国产午夜精品| 久久久免费毛片| 四虎永久国产精品| 国产精品传媒入口麻豆| 超碰在线免费公开| 国产91精品高潮白浆喷水| 日韩精品五月天| 国产女呦网站| 国产一区二区三区直播精品电影| 日本欧美视频| 免费av手机在线观看| 欧美亚洲国产怡红院影院| 91精品视频一区二区| 国产日韩欧美综合精品| 亚洲欧洲www| 久久野战av| 国产一区二区无遮挡| 中文字幕+乱码+中文字幕一区| 制服丝袜在线播放| 国产成人精品一区二区在线| 国产精品自在在线| 都市激情一区| 日韩女优人人人人射在线视频| 国产一区二区免费视频| 久久久久久久久亚洲精品| 久久精品人人爽| 日韩高清不卡一区二区| 天堂在线第六区| 欧美黑人巨大精品一区二区| 麻豆免费精品视频| 偷拍自拍在线| 91精品91久久久久久| jvid福利写真一区二区三区| 久久大胆人体| 北条麻妃高清一区| 亚洲欧美偷拍三级| 999精品嫩草久久久久久99| 无遮挡亚洲一区| 欧美午夜电影网| 四虎国产精品免费观看| 1024欧美极品| 欧美成人免费在线观看| 激情国产一区二区 | 国产精品综合二区| 啦啦啦中文在线观看日本| 亚洲综合社区网| 亚洲一区二区黄色| 色吊丝一区二区|