新聞中心
當(dāng)一個(gè)線(xiàn)程計(jì)劃執(zhí)行時(shí)它可以經(jīng)過(guò)幾個(gè)狀態(tài),包括未開(kāi)始,活躍,睡眠,等等。線(xiàn)程類(lèi)包含幾個(gè)允許你啟動(dòng)、停止、恢復(fù)、退出、暫停以及等待一個(gè)線(xiàn)程的方法。我們可以使用ThreadState屬性來(lái)獲取線(xiàn)程的當(dāng)前狀態(tài),狀態(tài)值可能是ThreadState枚舉中的一個(gè):

網(wǎng)頁(yè)設(shè)計(jì)是網(wǎng)站建設(shè)的前奏,好的網(wǎng)頁(yè)設(shè)計(jì)更深度的剖析產(chǎn)品和設(shè)計(jì)風(fēng)格定位,結(jié)合最新的網(wǎng)頁(yè)設(shè)計(jì)流行趨勢(shì),與WVI應(yīng)用標(biāo)準(zhǔn),設(shè)計(jì)出具企業(yè)表現(xiàn)力,大器而深穩(wěn)的網(wǎng)站界面設(shè)。創(chuàng)新互聯(lián)公司公司2013年成立,是成都網(wǎng)站建設(shè)公司:提供企業(yè)網(wǎng)站設(shè)計(jì),品牌網(wǎng)站建設(shè),營(yíng)銷(xiāo)型企業(yè)網(wǎng)站建設(shè)方案,成都響應(yīng)式網(wǎng)站建設(shè),成都微信小程序,專(zhuān)業(yè)建站公司做網(wǎng)站。
Aborted - 線(xiàn)程當(dāng)前處理停止?fàn)顟B(tài),但是不一定已經(jīng)執(zhí)行完。
AbortRequested – 已經(jīng)調(diào)用Abort() 方法但是線(xiàn)程還沒(méi)有接收到將試圖終止線(xiàn)程的System.Threading.ThreadAbortexception。雖然線(xiàn)程還沒(méi)有停止,但是馬上就會(huì)。
Background - 線(xiàn)程在后臺(tái)執(zhí)行。
Running - 線(xiàn)程已經(jīng)啟動(dòng)而且沒(méi)有被阻塞。
Stopped - 線(xiàn)程已經(jīng)完成了所有指令并停止了。
StopRequested - 請(qǐng)求線(xiàn)程停止。
Suspend - 線(xiàn)程已經(jīng)被掛起。
SuspendRequested - 請(qǐng)求掛起線(xiàn)程。
Unstarted - 線(xiàn)程還沒(méi)有調(diào)用Start()方法之前。
WaitSleepJoin - 調(diào)用Wait(), Sleep() 或 Join() 方法后處理阻塞狀態(tài)的線(xiàn)程。
圖3 顯示了一個(gè)線(xiàn)程的生命周期。
圖3
在這部分,我們將討論線(xiàn)程的生命周期
讓一個(gè)線(xiàn)程進(jìn)入睡眠狀態(tài)
當(dāng)我們創(chuàng)建一個(gè)線(xiàn)程后,我們需要調(diào)用線(xiàn)程對(duì)象的Start()方法來(lái)調(diào)度那個(gè)線(xiàn)程。在這時(shí),CLR將會(huì)為作為構(gòu)造函數(shù)參數(shù)傳遞給線(xiàn)程對(duì)象的方法地址分配一個(gè)時(shí)間片。一旦線(xiàn)程開(kāi)始執(zhí)行,它就可以在操作系統(tǒng)處理其他線(xiàn)程時(shí)回到睡眠狀態(tài)或者退出狀態(tài)。我們可以使用線(xiàn)程類(lèi)的Sleep()方法讓一個(gè)線(xiàn)程進(jìn)入睡眠狀態(tài)。如果你正在等待一個(gè)資源并且你想在稍后繼續(xù)嘗試訪問(wèn)這個(gè)資源時(shí),Sleep()方法是很重要的。舉個(gè)例子,假設(shè)你的程序由于無(wú)法訪問(wèn)需要的資源而導(dǎo)致其不能繼續(xù)執(zhí)行時(shí),你可能想要在幾毫秒之后嘗試?yán)^續(xù)訪問(wèn)資源,在這種情況下讓線(xiàn)程在再次嘗試訪問(wèn)資源之前睡眠一段時(shí)間是一個(gè)很好的方式。
Sleep()方法有兩種重載方式。第一種重載方法有一個(gè)整型參數(shù),并會(huì)按照指定的毫秒時(shí)間暫停線(xiàn)程執(zhí)行。例如,如果你向線(xiàn)程傳遞值100,那么線(xiàn)程將會(huì)暫停100毫秒。這個(gè)方法將會(huì)讓線(xiàn)程進(jìn)入WaitSleepJoin狀態(tài)。讓我們看一個(gè)例子,thread_sleep2.cs:
- /*************************************
- /* Copyright (c) 2012 Daniel Dong
- *
- * Author:Daniel Dong
- * Blog: www.cnblogs.com/danielWise
- * Email: guofoo@163.com
- *
- */
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Threading;
- namespace SimpleThread
- {
- public class ThreadSleep
- {
- public static Thread worker;
- public static Thread worker2;
- public static void Main()
- {
- Console.WriteLine("Entering the void Main!");
- worker = new Thread(new ThreadStart(Counter));
- worker2 = new Thread(new ThreadStart(Counter2));
- //Make the worker2 Object as highest priority
- worker2.Priority = ThreadPriority.Highest;
- worker.Start();
- worker2.Start();
- Console.WriteLine("Exiting the void Main!");
- Console.ReadLine();
- }
- public static void Counter()
- {
- Console.WriteLine("Entering Counter");
- for (int i = 1; i <50; i++)
- {
- Console.Write(i + " ");
- if (i == 10)
- {
- Console.WriteLine();
- Thread.Sleep(1000);
- }
- }
- Console.WriteLine("Exiting Counter");
- }
- public static void Counter2()
- {
- Console.WriteLine("Entering Counter2");
- for (int i = 51; i <100; i++)
- {
- Console.Write(i + " ");
- if (i == 70)
- {
- Console.WriteLine();
- Thread.Sleep(5000);
- }
- }
- Console.WriteLine("Exiting Counter2");
- }
- }
- }
Counter()方法從1到50計(jì)數(shù),當(dāng)?shù)竭_(dá)10以后睡眠1000毫秒。Counter2()方法從51~100計(jì)數(shù),當(dāng)?shù)竭_(dá)70時(shí)睡眠5000毫秒。下面是輸出結(jié)果:
注:以上是在多核CPU下運(yùn)行的結(jié)果,單核CPU 執(zhí)行情況可能與上圖有所出入。
第二種重載方法有一個(gè)TimeSpan類(lèi)型參數(shù),當(dāng)前線(xiàn)程會(huì)按照TimeSpan的值暫停一段時(shí)間。TimeSpan是System命名空間中的一個(gè)類(lèi)。TimeSpan有一些很有用的屬性并會(huì)返回基于時(shí)鐘時(shí)間間隔。
我們可以使用FromSeconds()和FromMinutes()來(lái)確定睡眠時(shí)間。下面是一個(gè)例子,thread_sleep3.cs:
- public static void Counter()
- {
- Console.WriteLine("Entering Counter");
- for (int i = 1; i <50; i++)
- {
- Console.Write(i + " ");
- if (i == 10)
- {
- Console.WriteLine();
- Thread.Sleep(TimeSpan.FromSeconds(1));
- }
- }
- Console.WriteLine("Exiting Counter");
- }
- public static void Counter2()
- {
- Console.WriteLine("Entering Counter2");
- for (int i = 51; i <100; i++)
- {
- Console.Write(i + " ");
- if (i == 70)
- {
- Console.WriteLine();
- Thread.Sleep(TimeSpan.FromSeconds(5));
- }
- }
- Console.WriteLine("Exiting Counter2");
- }
輸出結(jié)果與thread_sleep2類(lèi)似。
中斷一個(gè)線(xiàn)程
當(dāng)讓一個(gè)線(xiàn)程睡眠時(shí),它實(shí)際會(huì)進(jìn)入WaitSleepJoin狀態(tài)。如果線(xiàn)程處理睡眠狀態(tài),那么在它超時(shí)退出之前唯一可以喚醒線(xiàn)程的方式是使用Interrupt()方法。Interrupt()方法將讓線(xiàn)程回到調(diào)度隊(duì)列中去。讓我們看一個(gè)例子,thread_interrupt.cs:
- /*************************************
- /* Copyright (c) 2012 Daniel Dong
- *
- * Author:Daniel Dong
- * Blog: www.cnblogs.com/danielWise
- * Email: guofoo@163.com
- *
- */
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Threading;
- namespace SimpleThread
- {
- public class Interrupt
- {
- public static Thread sleeper;
- public static Thread worker;
- public static void Main()
- {
- Console.WriteLine("Entering the void Main!");
- sleeper = new Thread(new ThreadStart(SleepingThread));
- worker = new Thread(new ThreadStart(AwakeThread));
- sleeper.Start();
- worker.Start();
- Console.WriteLine("Exiting the void Main!");
- Console.ReadLine();
- }
- public static void SleepingThread()
- {
- for (int i = 1; i <50; i++)
- {
- Console.Write(i + " ");
- if (i == 10 || i == 20 || i == 30)
- {
- Console.WriteLine("Going to sleep at: " + i);
- try
- {
- Thread.Sleep(20);
- }
- catch (ThreadInterruptedException ex)
- {
- Console.WriteLine(ex.Message);
- }
- }
- }
- }
- public static void AwakeThread()
- {
- for (int i = 51; i <100; i++)
- {
- Console.Write(i + " ");
- if (sleeper.ThreadState == ThreadState.WaitSleepJoin)
- {
- Console.WriteLine("Interrupting the sleeping thread.");
- sleeper.Interrupt();
- }
- }
- }
- }
- }
在上面的例子中,當(dāng)計(jì)數(shù)器的值為10, 20 和 30 時(shí)第一個(gè)線(xiàn)程會(huì)睡眠。第二個(gè)線(xiàn)程會(huì)檢查第一個(gè)線(xiàn)程是否已經(jīng)進(jìn)入睡眠狀態(tài)。如果是的話(huà),它將中斷第一個(gè)線(xiàn)程并使它回到調(diào)度隊(duì)列中去。Interrupt()方法是讓睡眠線(xiàn)程重新醒來(lái)的最好方式,當(dāng)線(xiàn)程等待的資源可用且你想讓線(xiàn)程繼續(xù)運(yùn)行時(shí)你可以使用這個(gè)方法。輸出結(jié)果與下面顯示的類(lèi)似:
當(dāng)前標(biāo)題:.NET中線(xiàn)程的生命周期
文章鏈接:http://m.5511xx.com/article/ccoohge.html


咨詢(xún)
建站咨詢(xún)
