麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-17 02:33:08
字體:
供稿:網(wǎng)友

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

概述

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

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

Thread 的Sleep 和 Join 方法

Thread.Sleep:將當(dāng)前線程阻塞指定的毫秒數(shù)。

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

輸出結(jié)果:

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

Sleep也支持TimeSpan,將當(dāng)前線程阻塞指定的時(shí)間。

Thread.Join:阻塞調(diào)用線程,直到某個(gè)線程終止時(shí)為止。

第一次看到msdn的解釋一下子沒有反應(yīng)過來。這里我們可以理解為:分別開啟三個(gè)線程t1,t2,t3對(duì)t1,t2,t3依次調(diào)用Join后,程序會(huì)先把線程t1執(zhí)行完后,在執(zhí)行線程t2的內(nèi)容..以此類推到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("總結(jié):Join()會(huì)阻塞調(diào)用線程直到調(diào)用線程結(jié)束." + watch.ElapsedMilliseconds);    

輸出結(jié)果:

程序先執(zhí)行線程t1里的內(nèi)容,讓線程阻塞4秒,因?yàn)榫€程t1調(diào)用Join()方法阻塞調(diào)用線程,直到t1線程執(zhí)行完成。

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

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

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

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("總結(jié):Join()會(huì)阻塞調(diào)用線程直到調(diào)用線程結(jié)束." + watch.ElapsedMilliseconds);

輸出結(jié)果:

此時(shí)主線程會(huì)先開啟t1線程,t1被阻塞4秒 。所以t1線程里的內(nèi)容沒有被打印出來,會(huì)在4秒后打印。

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

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

主線程會(huì)繼續(xù)向下執(zhí)行打印出其他內(nèi)容。最后陸續(xù)由線程t2,線程t1打印出各自對(duì)應(yīng)信息。

Thread 的Abort 和Interrupt

Thread.Abort:在調(diào)用此方法的線程上引發(fā)ThreadAbortException,以開始終止此線程的過程。調(diào)用此方法通常會(huì)終止線程。

 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終止線程.當(dāng)前線程名稱:{0}.狀態(tài):{1}", Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);12         }13         Console.WriteLine("我在運(yùn)行著!");14     }15 16 });17 t1.Name = "t1";18 t1.Start();19 Thread.Sleep(1000);20 t1.Abort();21 Console.WriteLine("當(dāng)前線程名稱:{0}.狀態(tài):{1}", t1.Name, t1.ThreadState);

輸出結(jié)果:

開啟t1線程,阻塞800毫秒打印了二次“我在運(yùn)行著!”,準(zhǔn)備運(yùn)行第三次時(shí)。

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

當(dāng)前t1線程直接被干掉。

Thread.Abort:中斷處于WaitSleepJoin線程狀態(tài)的線程。

 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("我在運(yùn)行著!"); 9         }10         catch (ThreadInterruptedException ex)11         {12             Console.WriteLine("Interrupt終止線程.當(dāng)前線程名稱:{0}.狀態(tài):{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("當(dāng)前線程名稱:{0}.狀態(tài):{1}", t2.Name, t2.ThreadState);21 Console.Read();

輸出結(jié)果:

開啟t2線程,阻塞800毫秒打印了二次“我在運(yùn)行著!”,準(zhǔn)備運(yùn)行第三次時(shí)。

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

直到線程運(yùn)行結(jié)束。

線程鎖

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

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

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

輸出結(jié)果:

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

當(dāng)多個(gè)線程存在并發(fā)的時(shí),難免會(huì)碰到相互沖突的事情。這個(gè)時(shí)候我們就會(huì)用到鎖。

Lock()方法在MSIL中會(huì)被編譯成 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);  //堵塞線程.不然線程執(zhí)行時(shí)間太短,體現(xiàn)不出并發(fā)效果 9 10         Monitor.Enter(objLock);11         Console.WriteLine(number);12         number++;13         Monitor.Exit(objLock);14     }).Start();15 }

輸出結(jié)果:

加鎖后我們發(fā)現(xiàn)多線程在訪問共享變量采用的是排他模式。

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

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

 1 object objLock = new object(); 2 new Thread(() =>  3 { 4     Thread.Sleep(1000); 5     Monitor.Enter(objLock); 6  7     Console.WriteLine("我是第一個(gè)出現(xiàn)"); 8     Console.WriteLine("我是第二個(gè)出現(xiàn)"); 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("我是第三個(gè)出現(xiàn)");25     Console.WriteLine("我是第四個(gè)出現(xiàn)");26     Monitor.Wait(objLock);27     Console.WriteLine("完成2");28 29     Monitor.Exit(objLock);30 }).Start();

輸出結(jié)果:


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 99精品视频免费看 | 国产一区精品视频 | 亚洲aⅴ免费在线观看 | 久久精品视频一区二区 | 午夜久久久精品一区二区三区 | aa国产视频一区二区 | 91福利国产在线观一区二区 | 亚洲日本韩国在线观看 | 成年性羞羞视频免费观看 | 国产成人综合在线观看 | 欧美日韩免费一区二区三区 | 少妇的肉体k8经典 | 精品国产一区二区三区四区阿崩 | 婷婷久久青草热一区二区 | 在线成人一区二区 | 久久国产精 | 97伦理| 91九色精品国产 | 久久久精品网 | 国产精品欧美久久久久一区二区 | 精品一区二区三区免费视频 | 国产精品99久久99久久久二 | 国产做爰 | 亚洲一区在线观看视频 | 精精国产xxxx视频在线野外 | 成人在线网站 | 99成人在线 | 欧美日韩高清一区二区三区 | 在线天堂中文在线资源网 | 国产精品久久久久影院老司 | www.99久久久 | 在线免费亚洲 | 中文字幕在线亚洲 | 蜜桃网站在线观看 | 精品一区二区久久久久久按摩 | av在线一区二区三区 | 日本成年免费网站 | 护士xxxx | 免费观看黄色一级视频 | 国产成人av免费看 | videos高潮|