seerx性欧美巨大_久久一区国产_亚洲日本久久久午夜精品_久久精品2019中文字幕

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

南京傾心軟件歡迎您訪問(wèn)本站

13605185909

新聞資訊

NEWS CENTER
欄目導(dǎo)航

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

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

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

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

按照這種寫法自己試了下,運(yùn)行起來(lái)并不是他這種結(jié)果(運(yùn)行結(jié)果很隨機(jī))。

原因有以下兩點(diǎn):

1、支付線程與取書線程都屬于同級(jí)線程,運(yùn)行先后順序是隨機(jī)的

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

修正

首先,要明白實(shí)驗(yàn)的場(chǎng)景。還是引用這位仁兄的例子:“我去書店買書,當(dāng)我選中一本書后我會(huì)去收費(fèi)處付錢,付好錢后再去倉(cāng)庫(kù)取書。這個(gè)順序不能顛倒,我作為主線程,收費(fèi)處和倉(cāng)庫(kù)做兩個(gè)輔助線程” 。

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

代碼編寫如下:

復(fù)制代碼
 1 class Program
 2     {
 3         static int _num = 0;
 4         //本例重點(diǎn)對(duì)象
 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 + ",編號(hào): " + _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 + ",編號(hào): " + _num);
40                     //通知主線程,書已取走
41                     //_autoReset3.Set();
42                 }
43             }
44         }
45 
46 
47         static void Main(string[] args)
48         {
49             //本案例是通過(guò)AutoResetEvent來(lái)實(shí)現(xiàn)多線程同步
50             //購(gòu)買書數(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("主線程選書編號(hào):" + i);
69                 _num = i;
70                 //_autoReset.Set();
71 
72                 //通知付錢線程
73                 _autoReset0.Set();
74                 //主線延時(shí)1ms執(zhí)行(但不知道付錢線程這個(gè)過(guò)程需要多少時(shí)間)
75                 Thread.Sleep(1);
76                 //_autoReset2.WaitOne();
77 
78                 //付完錢后,通知取書線程
79                 _autoReset1.Set();
80                 //主線延時(shí)1ms執(zhí)行(但不知道取書線程這個(gè)過(guò)程需要多少時(shí)間)
81                 Thread.Sleep(1);
82                 //_autoReset3.WaitOne();
83                 Console.WriteLine("-----------------------------------");
84             }
85 
86             Console.ReadKey();
87 
88 
89         }
90     }
復(fù)制代碼

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

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

這時(shí)可以使用AutoResetEvent這個(gè)對(duì)象。上例中已經(jīng)使用這個(gè)對(duì)象。沒錯(cuò),還可以在繼續(xù)使用。

代碼如下圖:

復(fù)制代碼
 1 class Program
 2     {
 3         static int _num = 0;
 4         //本例重點(diǎn)對(duì)象
 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 + ",編號(hào): " + _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 + ",編號(hào): " + _num);
40                     //通知主線程,書已取走
41                     _autoReset3.Set();
42                 }
43             }
44         }
45 
46 
47         static void Main(string[] args)
48         {
49             //本案例是通過(guò)AutoResetEvent來(lái)實(shí)現(xiàn)多線程同步
50             //購(gòu)買書數(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("主線程選書編號(hào):" + i);
69                 _num = i;
70                 //_autoReset.Set();
71 
72                 //通知付錢線程
73                 _autoReset0.Set();
74                 //主線延時(shí)1ms執(zhí)行(但不知道付錢線程這個(gè)過(guò)程需要多少時(shí)間)
75                 //Thread.Sleep(1);
76                 //等待付錢線程
77                 _autoReset2.WaitOne();
78 
79                 //付完錢后,通知取書線程
80                 _autoReset1.Set();
81                 //主線延時(shí)1ms執(zhí)行(但不知道取書線程這個(gè)過(guò)程需要多少時(shí)間)
82                 //Thread.Sleep(1);
83                 //等待取書線程
84                 _autoReset3.WaitOne();
85                 Console.WriteLine("-----------------------------------");
86                 //完成后,繼續(xù)下一個(gè)任務(wù)處理
87             }
88 
89             Console.ReadKey();
90 
91 
92         }
93     }
復(fù)制代碼

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

運(yùn)行結(jié)果和上面使用指定主線程休眠所運(yùn)行結(jié)果是一樣的。但是,可以不用指定主線程休眠時(shí)間,也不需要指定。因?yàn)槟銢]法估計(jì)子線程所運(yùn)行的時(shí)間,而且每次運(yùn)行時(shí)間都不一樣。

后話

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

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

Copyright © 2020-2022 南京傾心軟件技術(shù)有限公司 版權(quán)所有     蘇ICP備2020070309號(hào)-1
QQ在線咨詢
13605185909
返回頂部
精品众筹模特私拍视频| 免费在线看电影| 亚洲第一视频网| 亚洲日本在线播放| 亚洲美女免费视频| 97免费在线观看视频| 狠狠久久亚洲欧美| 国产精品九九视频| 欧美日韩蜜桃| 激情视频综合网| 清纯唯美亚洲经典中文字幕| 亚洲精品成人a8198a| 高清不卡av| 99re在线播放| 国产在线激情| 欧美又大粗又爽又黄大片视频| 男女小视频在线观看| 亚洲视频在线观看| 日日夜夜视频| 日韩精品一区二区三区四区视频| 中文字幕的av| 欧美三级电影网址| 992tv成人免费影院| 性视频在线播放| 中文字幕欧美日韩va免费视频| 人人插人人射| 欧美精品一区二区三区在线 | 欧美色黄视频| 在线观看网站黄不卡| 成人午夜免费福利| 亚洲国产精品麻豆| 国产又色又爽又黄又免费| 亚洲国产电影在线观看| 日韩精品一区二区三| 99久久精品免费精品国产| 性色国产成人久久久精品| 久久精品国产在热久久| 色欲av无码一区二区三区| 亚洲免费网站| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | avove在线观看| 欧一区二区三区| 国产又大又长又粗又黄| 国产999精品在线观看| 天堂√在线观看一区二区| 巨大黑人极品videos精品| 欧美二区三区在线| 国产综合色在线观看| 欧美日韩国产精品一卡| 国产精品伦一区二区| 日韩aⅴ视频一区二区三区| 日本免费一区二区三区等视频| 天天人人精品| 精品三级久久久| 99精品一区二区三区的区别| 成人爽a毛片| 欧美亚洲色图视频| 久久成人高清| 日本老熟妇毛茸茸| 欧美大片一区| 波多野结衣办公室双飞| 久久在线91| 成人小视频免费看| 国产精品一区在线观看你懂的| av资源在线免费观看| 成人一级黄色片| 国产午夜精品无码一区二区| 国产日韩欧美a| 中文字幕在线观看你懂的| 亚洲综合另类小说| 手机看片福利永久| 91成人网在线| 欧美jizzhd精品欧美满| 亚洲成人精品视频| 成年人网站在线免费观看| 中文字幕自拍vr一区二区三区| 亚洲1024| 国产精品69av| 国产美女精品写真福利视频| 久久综合九色99| 亚洲免费一区三区| 国产男女无遮挡| 亚洲天堂久久| 美女爆乳18禁www久久久久久| 国产91精品免费| 五月婷婷色丁香| 亚洲午夜电影在线观看| 69xxxx视频| 亚洲福利视频久久| 深夜宅男网站免费进入| 欧美在线一级视频| 99re6在线精品视频免费播放| 免费在线成人av电影| 国产精品毛片视频| 久久人妻精品白浆国产| 最新亚洲视频| 在线观看亚洲大片短视频| 91在线看国产| 91片黄在线观看喷潮| 色婷婷激情一区二区三区| 国产99在线|亚洲| 中国china体内裑精亚洲片| 日韩私人影院| 91在线播放国产| 久久黄色免费网站| 国产a久久麻豆| 亚洲色成人www永久网站| 精品国产91久久久| 国产精彩自拍| 日韩日本欧美亚洲| 日本不卡不卡| 欧美日韩精品免费观看视一区二区| 成人看片黄a免费看视频| 男操女免费网站| 日韩精品1区2区3区| 久草国产在线视频| 亚洲激情图片小说视频| 性xxxxxxxxx18欧美| 亚洲天堂av高清| 国产人成在线观看| 国产精品久久久对白| 视频一区日韩| 手机在线国产视频| 国产在线播精品第三| 欧美性猛交xxxx乱大交hd| 欧美日韩国产一区中文午夜| 小视频在线播放| 久久久综合av| 黄色视屏在线免费观看| 99热一区二区三区| 午夜亚洲福利| 疯狂试爱三2浴室激情视频| 最近中文字幕一区二区三区| 久热免费在线视频| 中文字幕日韩在线视频| 久久黄色美女电影| 午夜一区二区三区| 色男人天堂综合再现| 91视频免费观看网站| 国产片一区二区| 先锋影音av男人站| 在线视频欧美日韩精品| 免费在线观看av| 亚洲欧美日韩国产yyy| 91精品亚洲| 91香蕉一区二区三区在线观看| 怡红院av一区二区三区| 九色91偷拍| 91国在线精品国内播放| 日本.亚洲电影| 99热手机在线| 国产精品自在欧美一区| 99视频免费看| 日韩成人av在线播放| 电影在线高清| 亚洲国产精品一区在线观看不卡| 天天综合一区| 欧美成人一二三区| 午夜日韩在线电影| 777奇米888色狠狠俺也去| 国产精品丝袜视频| 午夜免费欧美电影| 国产乱淫av麻豆国产免费| 久久久99精品免费观看| 亚洲精品自产拍在线观看 | 蜜桃av麻豆av天美av免费| 国产精品久久久久久久美男| 91成人短视频在线观看| 亚洲高清在线不卡| 97国产一区二区| 日本亚洲欧美美色| 久久久噜噜噜久久久| 国产一区二区主播在线| 国产视频1区2区3区| av一区二区三区四区| 区日韩二区欧美三区 | gay欧美网站| 能看的毛片网站| 成人网在线免费视频| 亚洲成人在线电影| 欧美夫妻性视频| 国产亚洲人成a在线v网站| 午夜激情视频网| 中文字幕va一区二区三区| jizzjizz韩国| 国产精品69av| 亚洲宅男一区| 欧美风情第一页| 欧美综合一区二区| 亚洲成人福利在线观看| 国产宾馆实践打屁股91| 亚洲色图狠狠干| 欧美激情中文字幕在线| 成人影院网站ww555久久精品| 成熟妇人a片免费看网站| 亚洲精品视频一区二区| 超清福利视频| 日韩美女视频免费看| 另类尿喷潮videofree| 日本一道本视频|