如何結束阻塞狀態的執行緒

2021-05-25 15:19:13 字數 740 閱讀 2112

vc/mfc

2009-02-07 16:30:26

閱讀109

字型大小:大

小訂閱

如果乙個執行緒由於等待某些事件的發生而被阻塞,又該如何實現該執行緒的中斷呢?比如當乙個執行緒由於需要等候鍵盤輸入而被阻塞,處於不可執行狀態時,即使主程式中將該執行緒的共享變數設定為true,但該執行緒此時根本無法檢查迴圈標誌,當然也就無法立即中斷。

其實,這種情況經常會發生,比如呼叫thread.join()方法,或者thread.sleep()方法,在網路中呼叫serversocket.accept()方法,或者呼叫了datagramsocket.receive()方法時,都有可能導致執行緒阻塞。即便這樣,仍然不要使用stop()方法,而是使用thread提供的interrupt()方法,因為該方法雖然不會中斷乙個正在執行的執行緒,但是它可以使乙個被阻塞的執行緒丟擲乙個中斷異常,從而使執行緒提前結束阻塞狀態,退出堵塞**。

下面看乙個例子來說明這個問題:

程式中如果執行緒m1發生了阻塞,那麼雖然執行了m1.stop=true;語句,但是stop的值並未改變。為了能夠中斷該執行緒,必須在異常處理語句中對共享變數的值進行重新設定,從而實現了在任何情況下都能夠中斷執行緒的目的。

一定要記住,m1.interrupt();語句只有當執行緒發生阻塞時才有效。它的作用就是丟擲乙個interruptedexception類的異常物件,使try…catch語句捕獲異常,並對其進行處理。請讀者仔細研究這個程式,以便能夠看出其中的巧妙之處。

執行緒阻塞狀態例項分析

有三種方法可以暫停threads執行 1.sleep方法 sleep時別的執行緒也不可以訪問鎖定物件。2.yield方法 讓出cpu的使用權,從執行態直接進入就緒狀態。讓cpu重新挑選哪乙個執行緒進入執行狀態。3.join方法 當某乙個執行緒等待另乙個執行緒執行結束後,才繼續執行時,使用join方法...

執行緒 執行和阻塞狀態詳解

所有現代的桌面和伺服器作業系統都採用搶占式排程策略,但一些小型裝置如手機等可能採用協作式排程策略,在這樣的系統中,只有當乙個執行緒呼叫了它的sleep 或yield 方法後才會放棄其所占用的資源 也就是必須有執行緒主動放棄其所占用的資源。當發生如下情況時,執行緒將進入阻塞狀態 1 執行緒呼叫了sle...

檔案非阻塞狀態開啟後改變為阻塞狀態

所以如果開啟檔案時是用非阻塞狀態開啟的 open dev tty o rdwr o noctty o ndelay 則可以用fcntl改變檔案狀態標誌 fcntl fd,f setfl,0 改變檔案為阻塞狀態。或者麻煩點,但易於理解 1 獲取檔案的flags,即open函式的第二個引數 flags ...