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

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

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

13605185909

新聞資訊

NEWS CENTER
欄目導(dǎo)航

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

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

之前在博客園看到有位仁兄發(fā)表一篇關(guān)于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)一次

修正

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

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

代碼編寫如下:

復(fù)制代碼
 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     }
復(fù)制代碼

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

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

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

代碼如下圖:

復(fù)制代碼
 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ù)下一個任務(wù)處理
87             }
88 
89             Console.ReadKey();
90 
91 
92         }
93     }
復(fù)制代碼

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

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

后話

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

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

Copyright © 2020-2022 南京傾心軟件技術(shù)有限公司 版權(quán)所有     蘇ICP備2020070309號-1
QQ在線咨詢
13605185909
返回頂部
久久一区二区中文字幕_日韩人体视频_国产影视一区_久久爱www.
国产精品久久久久久久久久直播| 欧美伦理影院| 欧美freesex8一10精品| 在线不卡视频| 欧美日本不卡视频| 香蕉久久一区二区不卡无毒影院 | 影音先锋日韩有码| 久久久水蜜桃| 亚洲免费人成在线视频观看| 极品裸体白嫩激情啪啪国产精品| 欧美精品www| 欧美亚洲免费| 亚洲欧美精品中文字幕在线| 一区二区三区在线视频播放 | 亚洲级视频在线观看免费1级| 欧美性猛交一区二区三区精品| 久久久久久久久久久久久女国产乱 | 免费成人高清视频| 午夜精品久久久久久久99樱桃| 亚洲国产高清在线| 国产亚洲欧美在线| 国产一区二区视频在线观看| 国产精品一区二区在线| 国产精品乱码妇女bbbb| 欧美婷婷在线| 国产农村妇女精品一区二区| 国外视频精品毛片| 在线观看成人一级片| 黑人操亚洲美女惩罚| 精品999网站| 亚洲女与黑人做爰| 久久国产精品免费一区| 久久久久综合| 欧美紧缚bdsm在线视频| 欧美视频在线视频| 国产精品www.| 国语自产在线不卡| 亚洲精品久久久蜜桃| 亚洲一区三区在线观看| 久久国产精品久久精品国产| 蜜桃视频一区| 国产精品久久久久永久免费观看 | 黄色国产精品一区二区三区| 国模精品一区二区三区色天香| 国产一区香蕉久久| 一区二区三区免费网站| 久久精品99| 欧美日韩成人精品| 国产啪精品视频| 亚洲激情午夜| 午夜精品视频在线观看| 欧美成人一品| 国产午夜精品全部视频播放| 欧美一区二区三区在线观看| 亚洲一区久久久| 久热国产精品视频| 国产亚洲精品aa| 夜夜嗨av一区二区三区网站四季av| 午夜免费日韩视频| 欧美伦理一区二区| 亚洲国产精品悠悠久久琪琪| 欧美伊人久久大香线蕉综合69| 欧美日韩不卡视频| 99国产麻豆精品| 欧美激情中文字幕在线| 亚洲级视频在线观看免费1级| 久久av一区| 国产自产高清不卡| 久久久亚洲精品一区二区三区| 国产区在线观看成人精品| 亚洲欧美精品在线| 国产精品区一区二区三区| 亚洲影视在线| 国产毛片精品国产一区二区三区| 在线亚洲欧美| 国产精品网站在线观看| 性高湖久久久久久久久| 欧美激情一区二区三区四区| 久久手机免费观看| 极品尤物av久久免费看| 欧美在线精品一区| 欧美成人午夜激情| 亚洲日本在线视频观看| 欧美激情1区2区| 亚洲色图制服丝袜| 黄色成人91| 亚洲一区二区视频在线| 国产女优一区| 久久久午夜电影| 亚洲免费大片| 国产午夜精品理论片a级探花 | 欧美电影在线观看| 亚洲激情一区二区三区| 欧美高清不卡| 亚洲少妇最新在线视频| 国产亚洲免费的视频看| 久久中文在线| 亚洲欧美日本在线| 今天的高清视频免费播放成人 | 麻豆九一精品爱看视频在线观看免费| 国产九色精品成人porny| 国产一区二区三区在线播放免费观看 | 久久国产精品久久精品国产| 国产自产精品| 国产乱码精品一区二区三区五月婷 | 欧美日本韩国| 麻豆国产精品va在线观看不卡| 亚洲一区欧美二区| 亚洲欧洲日产国码二区| 国产日韩在线播放| 国产精品每日更新| 久久久久欧美精品| 狠狠色丁香久久综合频道| 免费人成精品欧美精品| 亚洲一级片在线看| 亚洲美女福利视频网站| 黄色小说综合网站| 国产性做久久久久久| 国产精品海角社区在线观看| 欧美日韩精品一区二区天天拍小说| 久久久久久一区| 欧美日韩精品免费| 欧美精品三级日韩久久| 欧美激情麻豆| 欧美日韩四区| 国产精品家教| 国产日韩免费| 加勒比av一区二区| 亚洲卡通欧美制服中文| 夜夜爽www精品| 亚洲免费视频在线观看| 欧美在线视频在线播放完整版免费观看 | 一区二区三区蜜桃网| 亚洲另类黄色| 亚洲欧美制服另类日韩| 亚洲一区中文字幕在线观看| 午夜日韩在线| 亚洲精品一区二区三区四区高清| 日韩午夜在线观看视频| 日韩亚洲一区二区| 欧美精品福利| 亚洲婷婷在线| 欧美午夜电影一区| 午夜精品一区二区三区在线播放| 在线视频成人| 欧美日韩一区二区三区| 欧美一区在线直播| 一本色道久久加勒比88综合| 国产精品狠色婷| 欧美a级大片| 欧美精品一卡| 国产精品专区h在线观看| 国内成人在线| 亚洲一区亚洲二区| 久久综合色综合88| 午夜免费日韩视频| 久久亚洲精品视频| 欧美一区综合| 久久综合激情| 国产日韩专区在线| 亚洲一区二区三| 欧美二区不卡| 韩日欧美一区二区| 午夜日韩福利| 国产精品初高中精品久久| 亚洲二区精品| 免费看av成人| 国产一区美女| 久久久久久久久久久一区| 国产亚洲欧洲一区高清在线观看 | 欧美激情精品久久久| 国产亚洲在线观看| 午夜亚洲激情| 国产农村妇女精品一区二区| 亚洲欧美成人一区二区在线电影| 欧美日韩专区| 亚洲一区在线观看视频 | 亚洲欧美日韩一区二区三区在线观看| 欧美福利一区| 一本色道久久加勒比88综合| 欧美日韩视频专区在线播放| 亚洲午夜视频在线| 欧美视频二区36p| 欧美伊久线香蕉线新在线| 欧美一区二区三区视频免费| 欧美精品情趣视频| 亚洲一级片在线观看| 国产精品户外野外| 香港久久久电影| 亚洲大胆av| 国产精品成人v| 久久成人国产| 久久成人精品无人区| 99国产精品久久| 欧美日韩一区高清| 久久久久9999亚洲精品| 91久久综合亚洲鲁鲁五月天| 国产亚洲综合性久久久影院| 欧美亚洲专区| 99ri日韩精品视频|