国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#多線程實踐——提前釋放鎖

2019-11-17 02:22:27
字體:
來源:轉載
供稿:網友

C#多線程實踐——提前釋放鎖

  一個被阻止的線程可以通過兩種方式被提前釋放:

  • 使用Thread.Interrupt
  • 使用Thread.Abort

釋放一個線程的鎖必須通過另外活動的線程實現,等待的線程自己是不能對它的被阻止狀態做任何事情。

Interrupt方法

  在一個被阻止的線程上調用Interrupt 方法,將強制釋放它,同時拋出ThreadInterruptedException異常,如下:

class PRogram {    static void Main()    {        Thread t = new Thread (delegate()        {            try             {                Thread.Sleep (Timeout.Infinite);            }            catch (ThreadInterruptedException)            {                Console.Write ("Forcibly ");           }           Console.WriteLine ("Woken!");        });     t.Start();     t.Interrupt();  }} Output:    Forcibly Woken!             

  中斷一個線程僅僅釋放它的當前的(或下一個)等待狀態,并不結束這個線程(當然,除非未處理ThreadInterruptedException異常)。

如果Interrupt被一個未阻止的線程調用,那么線程將繼續執行直到下一次被阻止時,它拋出ThreadInterruptedException異常。用下面的測試避免這個問題,不過這不是一個線程安全的方式。

if ((worker.ThreadState & ThreadState.WaitSleepJoin) > 0)  worker.Interrupt();

  隨意中斷線程有很大風險,因為任何框架或第三方方法在調用堆棧時都可能意外地在已訂閱的代碼上收到中斷。如果這個方法沒有被設計成可以被中斷(沒有適當處理finally塊)的對象,可能剩下無用的狀態,或資源釋放不完全。如果確切知道應該在哪兒中斷,中斷一個線程也是安全的,比如信號系統。

Abort方法

  被阻止的線程也可以通過Abort方法被強制釋放,除了用ThreadAbortException異常代替了ThreadInterruptedException異常,與調用Interrupt相似。異常將被拋出在catch里,直到Thread.ResetAbort在catch中被調用,在這期間線程的ThreadState為AbortRequested。

Interrupt 與 Abort 之間最大不同在于它們調用一個非阻止線程所發生的事情。Interrupt繼續工作直到下一次阻止發生,Abort在線程當前所執行的位置(可能甚至不在你的代碼中)拋出異常。終止一個非阻止的線程會帶來嚴重的后果。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 上杭县| 浙江省| 响水县| 麻栗坡县| 儋州市| 阿图什市| 留坝县| 白沙| 策勒县| 温宿县| 博爱县| 锡林浩特市| 额济纳旗| 阳原县| 石林| 新竹县| 江安县| 道孚县| 宁陵县| 张家港市| 宝丰县| 永宁县| 阳原县| 和顺县| 岗巴县| 渭南市| 加查县| 伊宁县| 庆云县| 安顺市| 博白县| 鹤壁市| 临猗县| 万源市| 太湖县| 高台县| 原平市| 柏乡县| 收藏| 中方县| 丹寨县|