程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#線程從陌生到熟悉(2)

C#線程從陌生到熟悉(2)

編輯:C#入門知識

 

首先我們來看看線程的狀態

線程狀態

表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>

 

 


  摘自 ENUO

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved