Java裡乙個執行緒呼叫了Thread interrupt 到底意味著什麼?

時間 2021-05-14 12:20:03

1樓:快樂心靈知識站

有乙個很重要的事情,在Android 中會有點特殊,

正常情況下,當執行緒中的run方法執行完畢後,執行緒是會自動關閉,不需要我們手動去關閉的。

如:new

Thread

(new

Runnable

()}).

start

();而當run方法中的操作會不斷迴圈執行時如:

newThread

(new

Runnable()}

}).start

();這個執行緒中run方法會迴圈執行,並不會中斷,所以執行緒一會一直執行,Android中如果不做終止,即使退出activity也會一直執行,所以我們需要手動終止執行緒,終止執行緒的方法:

1.Thread.stop(),該方法是暴力停止執行緒不推薦使用,已經廢棄。

2.使用標記位來停止,如下面例子,如果我們要在activity 銷毀時退出執行緒:

private

void

stopThread()}

}});

mThread

.start

();}

@Override

protected

void

onDestroy

()isStopThread變數來判斷是否退出執行緒,如需要退出就直接退出迴圈,執行緒終止。

3.使用interrupt方法來停止執行緒:

private

void

stopThread()}

}});

mThread

.start

();}

@Override

protected

void

onDestroy

()我們使用mThread.interrupt來中斷執行緒,在run方法中使用mThread.isInterrupted()來判斷執行緒是否中斷,如果中斷責跳出迴圈,這個標識位的原理其實是一樣的。

mThread.interrupt並不是強行中斷執行緒,只是給執行緒設定乙個標誌,告訴執行緒我需要中斷。

接下來我們看下執行緒阻塞的情況下:

private

void

stopThread

()try

catch

(InterruptedExceptione)

}}});mThread

.start

();}

@Override

protected

void

onDestroy

()我們看下log:

從log中我們看到退出activity時,執行緒阻塞丟擲了異常,而mThread.isInterrupted()仍然為false,所以執行緒並沒有被中斷,這是因為現在進入阻塞時呼叫mThread.interrupt()方法,會丟擲異常同時還會呼叫interrupted()方法,把isInterrupted恢復稱false,所以執行緒不會被終止,

解決方法很簡單我們只要在出現異常中退出迴圈就可以了:

while

(true

)try

catch

(InterruptedExceptione)}

2樓:我的球風寫意

interrupt方法簡單的把中斷狀態設定為ture,被通知中斷的執行緒在阻塞時,這個時候丟擲異常,並且中斷狀態為false。

interrupted方法做兩件事,返回當前中斷狀態,和清除中斷狀態,不能恢復false為true,只能把true清除為false。

3樓:不能說的秘密

首先樓主要知道,乙個執行緒在未正常結束之前, 被強制終止是很危險的事情. 因為它可能帶來完全預料不到的嚴重後果比如會帶著自己所持有的鎖而永遠的休眠,遲遲不歸還鎖等。 所以你看到Thread.

suspend, Thread.stop等方法都被Deprecated了

4樓:

有一點我覺得應該指出,在表示interrupt方法時,不能表示成Thread.interrupt(), 因為interrupt這個方法不是跟靜態類掛鉤,而是跟例項掛鉤的。Thread.

interrupt()不能表示向任何程序傳送中斷資訊。而Thread.interrupted()是靜態方法,表示檢視當前活動的程序的終端狀態,並重置識別符號。

5樓:Intopass

首先,乙個執行緒不應該由其他執行緒來強制中斷或停止,而是應該由執行緒自己自行停止。

所以,Thread.stop, Thread.suspend, Thread.resume 都已經被廢棄了。

而 Thread.interrupt 的作用其實也不是中斷執行緒,而是「通知執行緒應該中斷了」,

具體到底中斷還是繼續執行,應該由被通知的執行緒自己處理。

具體來說,當對乙個執行緒,呼叫 interrupt() 時,

① 如果執行緒處於被阻塞狀態(例如處於sleep, wait, join 等狀態),那麼執行緒將立即退出被阻塞狀態,並丟擲乙個InterruptedException異常。僅此而已。

② 如果執行緒處於正常活動狀態,那麼會將該執行緒的中斷標誌設定為 true,僅此而已。被設定中斷標誌的執行緒將繼續正常執行,不受影響。

interrupt() 並不能真正的中斷執行緒,需要被呼叫的執行緒自己進行配合才行。

也就是說,乙個執行緒如果有被中斷的需求,那麼就可以這樣做。

① 在正常執行任務時,經常檢查本執行緒的中斷標誌位,如果被設定了中斷標誌就自行停止執行緒。

② 在呼叫阻塞方法時正確處理InterruptedException異常。(例如,catch異常後就結束執行緒。)

Thread thread = new Thread(() -> {

while (!Thread.interrupteddo more workthread.start();

// 一段時間以後

thread.interrupt();

具體到你的問題,Thread.interrupted()清除標誌位是為了下次繼續檢測標誌位。

如果乙個執行緒被設定中斷標誌後,選擇結束執行緒那麼自然不存在下次的問題,

而如果乙個執行緒被設定中斷標識後,進行了一些處理後選擇繼續進行任務,

而且這個任務也是需要被中斷的,那麼當然需要清除標誌位了。

6樓:cao

不同作業系統還不一樣,以linux為例:

interrupt就是把中斷標誌位set為true,並將執行緒unpark起來。

interrupted返回中斷標誌,引數為true的話會把標誌位設為false,因為park方法會先判斷標誌位狀態才確定是否park,如果不清除就會造成下次park不住。

Java中,有乙個for迴圈呼叫網路api很耗時,請問如何減少耗時?

碼神手記 典型的IO優化場景,核心思想是減少IO次數,提高並行度。方法如下 1 合併可以合併的請求,減少請求次數。2 利用執行緒池,多個請求並行發起。注意設定超時時間,避免慢請求耗盡執行緒資源。3 快取可以快取的資料,減少請求次數。4 使用支援非同步化 NIO 多路復用的網路請求元件。比如基於net...

請問,多個執行緒可以讀乙個變數,只有乙個執行緒可以對這個變數進行寫,到底要不要加鎖?

陳磊 我寫了很多年的乙個寫法 主線程裡設個quit flag,其它執行緒讀這個標誌後紛紛break出while迴圈,退出執行緒,典型的你說的場景,不加鎖,我也一直糾結我這個寫法符不符合最佳實踐,希望陳碩,劉然等大牛能解答 我敢當 要加鎖。乙個原因是編譯器可能會優化讀過程,如果不加鎖,編譯器可能會改變...

在java裡定義乙個字段,private int id int id 這樣子。有什麼區別。規範嗎?

a 當歸 有個段子很適合回答 班裡的乙個男生摸了女生的xiong 女生大叫 It s private 男生說 But we are in the same class 理想e鍋蓋 舉個栗子 新建乙個學生類 public class Student建立兩個變數,乙個用private修飾,乙個不用pri...