程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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

由於調用WaitSleepJoin,線程已被阻止

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