表1-1 ThreadState定義的枚舉常數
成員名稱
說 明
Aborted
線程處於Stopped狀態中
AbortRequested
已對線程調用了Thread.Abort方法,但線程尚未收到試圖終止它的掛起的System.Threading. ThreadAbortException
Background
線程正作為後台線程執行(相對於前台線程而言)。此狀態可以通過設置Thread.IsBackground屬性來控制
Running
線程已啟動,它未被阻塞,並且沒有掛起的ThreadAbortException
Stopped
線程已停止
StopRequested
正在請求線程停止。這僅用於內部
Suspended
線程已掛起
SuspendRequested
正在請求線程掛起
Unstarted
尚未對線程調用Thread.Start方法
WaitSleepJoin
由於調用Wait、Sleep或Join,線程已被阻止
Thread對象的ThreadState屬性提供一個由ThreadState定義的位掩碼,它指示線程的當前狀態。一個線程至少總是處於ThreadState枚舉中定義的一個可能狀態,並且可以同時處於多個狀態。
注意,只能在一些調試方案中使用線程狀態,而不應該在代碼中使用線程狀態來同步線程活動。
在創建托管線程時,該線程處於Unstarted狀態。線程會保持Unstarted狀態,直到被操作系統調度到已啟動狀態。調用Start方法使操作系統知道該線程可啟動,但是它並不直接更改線程的狀態。一旦線程處於已啟動的狀態中,就可以執行許多操作來使線程更改狀態。表1-2列出了使狀態發生更改的操作,以及相應的新狀態。
表1-2 使線程狀態發生更改的操作及相應的新狀態
操 作
ThreadState
在公共語言運行庫中創建線程
Unstarted
線程調用Start
Unstarted
線程開始運行
Running
續表
操 作
ThreadState
線程調用Sleep
WaitSleepJoin
線程對其他對象調用Wait
WaitSleepJoin
線程對其他線程調用Join
WaitSleepJoin
另一個線程調用Interrupt
Running
另一個線程調用Suspend
SuspendRequested
線程響應Suspend請求
Suspended
另一個線程調用Resume
Running
另一個線程調用Abort
AbortRequested
線程響應Abort請求
Stopped
線程被終止
Stopped
Abort方法,調用該方法後,在當前線程中引發一個ThreadAbortException異常,該異常導致線程死亡!線程進入Stopped狀態,不能在重啟!
請看下面的例子
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Threading;
namespace
ConsoleApplication4
{
class
Program
{
static
void
Main(
string
[] args)
{
Thread t1 =
new
Thread(Print);
// t1.Abort();引發ThreadAbortException異常
t1.Start();
// t1.Abort();
//t1.Join();阻塞調用線程,直到某個線程終止時為止。
Console.WriteLine(
"主線程被調用"
);
// t1.Start();引發ThreadAbortException異常無法重新啟動
}
static
void
Print()
{
Thread.Sleep(2000);
Console.WriteLine(
"線程被調用!"
);
}
}
}
從這個例子中,我們可以看出,線程處於Unstarted狀態時,調用Abort()方法時,將引發異常!
將第二個注釋打開,得到如下結果
線程被終止了!把第四個注釋打開,又會引發異常!
在這裡我要說明下Join()這個方法,將第三個注釋打開,會得到如下結果,
Join這個方法的作用是阻塞調用他的線程,換句話說就是調用他的線程處於阻塞狀態,直到這個線程執行結束,調用他的線程才繼續執行!這裡調用他的線程指的是主線程!
Interrupt 該方法打斷一個處於WaitSleepJoin狀態的線程。
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Threading;
namespace
ConsoleApplication5
{
class
Program
{
static
void
Main(
string
[] args)
{
Thread t1 =
new
Thread(Print);
t1.Start();
Thread.Sleep(500);
t1.Interrupt();
Thread.Sleep(500);
Console.WriteLine(
"主線執行結束!"
);
}
static
void
Print()
{
try
{
Thread t2=
new
Thread(Print2);
t2.Start();
t2.Join();
}
catch
(Exception e)
{
Console.WriteLine(
"捕獲到異常:{0}"
, e.ToString());
}
Console.WriteLine(
"線程1運行!"
);
}
static
void
Print2()
{
Thread.Sleep(2000);
Console.WriteLine(
"線程2運行!"
);
}
}
}
運行結果為
從中可以看出線程1調同線程2的方法時被打斷了,以致於線程1直接運行了!這個就是Interrupt得作用!如果將Interrupt這個方法給注釋掉,那就會看到線程2運行完了,線程1才繼續運行!Interrupt 該方法打斷一個處於WaitSleepJoin狀態的線程。應該可以理解了吧!
好了,這次就到這裡了!
<script></script>