亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C# 線程--第二線程方法

2019-11-17 02:33:08
字體:
來源:轉載
供稿:網友

C# 線程--第二線程方法

概述

  上一章節中和大家分享了線程的基礎使用方法。在這一章中來和大家分享線程的一些常用方法。

  主要包括:線程阻塞,線程終止,線程鎖三方面。

Thread 的Sleep 和 Join 方法

Thread.Sleep:將當前線程阻塞指定的毫秒數。

Console.WriteLine("主線程執行時間:{0}", DateTime.Now.ToString());Thread.Sleep(4000);  //阻塞4sConsole.WriteLine("主線程執行時間:{0}", DateTime.Now.ToString());

輸出結果:

兩次打印輸出間隔為:4秒。線程阻塞以毫秒為單位。

Sleep也支持TimeSpan,將當前線程阻塞指定的時間。

Thread.Join:阻塞調用線程,直到某個線程終止時為止。

第一次看到msdn的解釋一下子沒有反應過來。這里我們可以理解為:分別開啟三個線程t1,t2,t3對t1,t2,t3依次調用Join后,程序會先把線程t1執行完后,在執行線程t2的內容..以此類推到t3。

如下代碼所示:

 1 var watch = Stopwatch.StartNew(); 2 Thread t1 = new Thread(() => 3 { 4     Thread.Sleep(4000); 5     Console.WriteLine("t1 is ending."); 6 }); 7 t1.Start(); 8 t1.Join(); 9 Console.WriteLine("t1.Join() returned.");10 11 Thread t2 = new Thread(() =>12 {13     Thread.Sleep(1000);14     Console.WriteLine("t2 is ending.");15 });16 t2.Start();17 t2.Join();18 Console.WriteLine("t2.Join() returned.");19 20 Console.WriteLine("總結:Join()會阻塞調用線程直到調用線程結束." + watch.ElapsedMilliseconds);    

輸出結果:

程序先執行線程t1里的內容,讓線程阻塞4秒,因為線程t1調用Join()方法阻塞調用線程,直到t1線程執行完成。

然后打印出“t1.Join() returned.”。在執行t2線程,直到t2線程執行完后才執行主線程打印的內容。

這里不難看出他們是按順序來執行的。

如果我們不使用join()方法看看他的輸出結果會是怎么樣:

var watch = Stopwatch.StartNew();Thread t1 = new Thread(() =>{    Thread.Sleep(4000);    Console.WriteLine("t1 is ending.");});t1.Start();//t1.Join();Console.WriteLine("t1.Join() returned.");Thread t2 = new Thread(() =>{    Thread.Sleep(1000);    Console.WriteLine("t2 is ending.");});t2.Start();//t2.Join();Console.WriteLine("t2.Join() returned.");Console.WriteLine("總結:Join()會阻塞調用線程直到調用線程結束." + watch.ElapsedMilliseconds);

輸出結果:

此時主線程會先開啟t1線程,t1被阻塞4秒 。所以t1線程里的內容沒有被打印出來,會在4秒后打印。

這時主線程不會等待t1線程完成后在執行下面代碼,主線程會繼續向下執行打印出“t1.Join() returned.”

然后開啟t2線程,t2線程同樣也會被阻塞了1秒。

主線程會繼續向下執行打印出其他內容。最后陸續由線程t2,線程t1打印出各自對應信息。

Thread 的Abort 和Interrupt

Thread.Abort:在調用此方法的線程上引發ThreadAbortException,以開始終止此線程的過程。調用此方法通常會終止線程。

 1 Thread t1 = new Thread(() => 2 { 3     for (int i = 0; i < 4; i++) 4     { 5         try 6         { 7             Thread.Sleep(400); 8         } 9         catch (ThreadAbortException ex)10         {11             Console.WriteLine("Abort終止線程.當前線程名稱:{0}.狀態:{1}", Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);12         }13         Console.WriteLine("我在運行著!");14     }15 16 });17 t1.Name = "t1";18 t1.Start();19 Thread.Sleep(1000);20 t1.Abort();21 Console.WriteLine("當前線程名稱:{0}.狀態:{1}", t1.Name, t1.ThreadState);

輸出結果:

開啟t1線程,阻塞800毫秒打印了二次“我在運行著!”,準備運行第三次時。

阻塞1000毫秒的主線程調用Abort()方法直接把t1線程給干掉了.他再也沒有站起來執行第四次打印。

當前t1線程直接被干掉。

Thread.Abort:中斷處于WaitSleepJoin線程狀態的線程。

 1 Thread t2 = new Thread(() => 2 { 3     for (int i = 0; i < 4; i++) 4     { 5         try 6         { 7             Thread.Sleep(400); 8             Console.WriteLine("我在運行著!"); 9         }10         catch (ThreadInterruptedException ex)11         {12             Console.WriteLine("Interrupt終止線程.當前線程名稱:{0}.狀態:{1}", Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);13         }14     }15 });16 t2.Name = "t2";17 t2.Start();18 Thread.Sleep(1000);19 t2.Interrupt();20 Console.WriteLine("當前線程名稱:{0}.狀態:{1}", t2.Name, t2.ThreadState);21 Console.Read();

輸出結果:

開啟t2線程,阻塞800毫秒打印了二次“我在運行著!”,準備運行第三次時。

阻塞1000毫秒的主線程調用Interrupt()方法把t2線程第三次阻塞中斷,但t2線程并未被終止,繼續在運行。

直到線程運行結束。

線程鎖

Monitor.Enter() 和Monitor.Exit() :在指定對象上獲取排他鎖。

先來看一下多線程在訪問共享變量未加鎖的情況:

 1 int number = 0; 2 //沒加鎖 3 for (int i = 0; i < 10; i++) 4 { 5     new Thread(() => 6     { 7         Thread.Sleep(1000);  //堵塞線程.不然線程執行時間太短,體現不出并發效果 8         Console.WriteLine(number); 9         number++;10     }).Start();11 }

輸出結果:

我們發現開啟10個線程去訪問一個共享變量number,在沒有加鎖的情況下有5個線程訪問到的值都是:0。

當多個線程存在并發的時,難免會碰到相互沖突的事情。這個時候我們就會用到鎖。

Lock()方法在MSIL中會被編譯成 Monitor.Enter()和Monitor.Exit()。

在來看看多線程在訪問共享變量加鎖的情況:

 1 //加鎖 2 int number = 0; 3 object objLock = new object(); 4 for (int i = 0; i < 10; i++) 5 { 6     new Thread(() => 7     { 8         Thread.Sleep(100);  //堵塞線程.不然線程執行時間太短,體現不出并發效果 9 10         Monitor.Enter(objLock);11         Console.WriteLine(number);12         number++;13         Monitor.Exit(objLock);14     }).Start();15 }

輸出結果:

加鎖后我們發現多線程在訪問共享變量采用的是排他模式。

每次訪問共享變量都只有一個線程,其他線程只能等待別的線程訪問完成后才能進行訪問。[Monitor.Enter()和Monitor.Exit()必須是成對使用.]

Monitor.Wait() /Monitor.Pulse() :釋放對象上的鎖并阻止當前線程,直到它重新獲取該鎖。/通知等待隊列中的線程鎖定對象狀態的更改。

 1 object objLock = new object(); 2 new Thread(() =>  3 { 4     Thread.Sleep(1000); 5     Monitor.Enter(objLock); 6  7     Console.WriteLine("我是第一個出現"); 8     Console.WriteLine("我是第二個出現"); 9     Monitor.Wait(objLock);10     Console.WriteLine("完成1");11     Monitor.Pulse(objLock);12 13     Monitor.Exit(objLock);14     15 }).Start();16 17 18 new Thread(() =>19 {20     Thread.Sleep(2000);21     Monitor.Enter(objLock);22 23     Monitor.Pulse(objLock);24     Console.WriteLine("我是第三個出現");25     Console.WriteLine("我是第四個出現");26     Monitor.Wait(objLock);27     Console.WriteLine("完成2");28 29     Monitor.Exit(objLock);30 }).Start();

輸出結果:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品久久久久久综合乱菊| 一区二区三区国产在线观看| 亚洲欧洲第一视频| 国产精品久久久久久久久久尿| 国产精品狼人色视频一区| 国产成人高清激情视频在线观看| 精品国产乱码久久久久久虫虫漫画| 久久久久久国产| 亚洲少妇中文在线| 国产日韩在线视频| 蜜月aⅴ免费一区二区三区| 97精品免费视频| 欧美风情在线观看| 久久青草精品视频免费观看| 久久久久久久久中文字幕| 久久国产精品99国产精| 国产欧美久久一区二区| 亚洲成人av片在线观看| 日本高清不卡的在线| 亚洲女人天堂色在线7777| 日韩在线观看高清| 国产999在线| 国产精品美女久久久久久免费| 欧美成人性色生活仑片| 日韩高清a**址| 日韩av不卡在线| 91在线中文字幕| 免费99精品国产自在在线| 欧美久久久精品| 欧美极品少妇全裸体| 成人国内精品久久久久一区| 欧美日韩在线视频首页| 乱亲女秽乱长久久久| 日韩精品视频在线| 欧美大片在线影院| 色樱桃影院亚洲精品影院| 欧美日韩激情网| 在线成人中文字幕| 亚洲精品国产精品国产自| 国产精品9999| 久久精品国产99国产精品澳门| 亚洲免费av电影| 欧美日韩综合视频| 欧美日韩性视频| 亚洲女成人图区| 久久色精品视频| 成人性教育视频在线观看| 欧美精品制服第一页| 国产成人综合av| 国产主播精品在线| 国产欧美精品xxxx另类| 一区二区三区黄色| 精品久久香蕉国产线看观看gif| 国模视频一区二区| 久久综合免费视频| 亚洲人成亚洲人成在线观看| 欧美精品aaa| 亚洲sss综合天堂久久| 国产精品视频一区二区高潮| 欧美人交a欧美精品| 成人国产精品av| 国产精品偷伦一区二区| 日韩欧美视频一区二区三区| 久久久久日韩精品久久久男男| 国产视频久久久| 日韩在线视频免费观看高清中文| 精品久久久久久中文字幕一区奶水| 国产丝袜视频一区| 亚洲一区二区三区sesese| 日韩欧美精品中文字幕| 欧美国产激情18| 国产精品永久免费| 96pao国产成视频永久免费| 中文字幕在线看视频国产欧美| 欧美日产国产成人免费图片| 精品少妇v888av| 国产精品久久久久久久久久久不卡| 57pao成人永久免费视频| 69av在线视频| 午夜精品三级视频福利| 91九色精品视频| 久久久久久国产免费| 精品无人区太爽高潮在线播放| 国产在线拍揄自揄视频不卡99| 91免费版网站入口| 日韩国产欧美精品一区二区三区| 日本一区二区三区四区视频| 日韩av影片在线观看| 国产精品九九久久久久久久| 亲爱的老师9免费观看全集电视剧| 国产区精品在线观看| 色婷婷av一区二区三区在线观看| 亚洲精品影视在线观看| 国产91免费看片| 一个人看的www欧美| 亚洲欧美日韩久久久久久| 欧美日韩午夜激情| 国产精品视频白浆免费视频| 亚州精品天堂中文字幕| 欧美日韩激情视频| 国产综合色香蕉精品| 岛国精品视频在线播放| yellow中文字幕久久| 欧美性xxxx在线播放| 日韩av在线免费| 国产丝袜一区二区| 成人高清视频观看www| 日韩免费观看视频| 欧美视频第一页| 欧洲美女7788成人免费视频| 91视频-88av| 日韩欧美在线免费观看| 草民午夜欧美限制a级福利片| 亚洲欧洲日产国产网站| 亚洲欧美激情视频| 久久人人看视频| 欧美性猛交xxxx偷拍洗澡| 欧美亚洲免费电影| 91免费视频网站| 亚洲激情电影中文字幕| 欧美激情奇米色| 日韩电影网在线| 欧洲精品久久久| 亚洲欧美综合精品久久成人| 亚洲国产另类久久精品| 亚洲欧美国产精品久久久久久久| 亚洲综合在线播放| 国产精品88a∨| 欧美另类高清videos| 亚洲欧美在线一区| 亚洲国产精品久久久久秋霞不卡| 亚洲精品视频播放| 国产日韩综合一区二区性色av| 日韩精品欧美激情| 伊人久久男人天堂| 91久久精品美女| 久久国产精品久久久久久| 国产精品都在这里| 57pao国产精品一区| 永久免费毛片在线播放不卡| www亚洲精品| 精品伊人久久97| 大胆人体色综合| 最近2019中文字幕大全第二页| 欧美视频在线观看 亚洲欧| 国产精品三级在线| 欧美性资源免费| 亚洲视频电影图片偷拍一区| 欧美激情网站在线观看| 亚洲91精品在线观看| 亚洲免费人成在线视频观看| 亚洲午夜av电影| 欧美日韩国产精品| 欧美一区视频在线| 日本免费在线精品| 日韩在线视频中文字幕| 亚洲自拍小视频免费观看| 国产精品精品视频| 久久精品视频在线观看| 亚洲欧美综合图区| 日韩女在线观看| 亚洲人成啪啪网站| 深夜福利91大全| 欧美伊久线香蕉线新在线|