這是一個簡短的問題。在某個時候,我的線程明白它應該自殺。什麼是最好的辦法:線程應該如何在Java中自行關閉?
- Thread.currentThread()。interrupt();
- return;
順便說一下,爲什麼在第一種情況下我們需要使用currentThread
? Thread
是否不引用當前線程?
這是一個簡短的問題。在某個時候,我的線程明白它應該自殺。什麼是最好的辦法:線程應該如何在Java中自行關閉?
順便說一下,爲什麼在第一種情況下我們需要使用currentThread
? Thread
是否不引用當前線程?
如果你想終止線程,那麼只是返回是好的。你不需要調用Thread.currentThread().interrupt()
(它不會做任何壞事,只是你不需要)。這是因爲interrupt()
基本上是用來通知線程的所有者(當然,不是100%準確的,但是有點)。因爲你是線程的所有者,並且你決定終止線程,所以沒有人需要通知,所以你不需要調用它。
順便說一句,爲什麼在第一種情況下我們 需要使用currentThread?線程 是不是指向當前線程?
是的,它沒有。我想這可能會令人困惑,因爲例如Thread.sleep()影響當前線程,但Thread.sleep()是一種靜態方法。
如果你不是線程的所有者(例如,如果你還沒有擴展Thread
和編碼的Runnable
等)叫你應該做的
Thread.currentThread().interrupt();
return;
這樣一來,無論你的代碼運行的就知道了線程被中斷=(通常)應停止正在進行的任何操作並終止。正如我剛纔所說,它只是一種溝通機制。所有者可能會簡單地忽略被中斷的狀態並且什麼都不做......但是如果你確實設置了被中斷的狀態,那麼將來有人會爲此感謝你。
出於同樣的原因,你永遠不
Catch(InterruptedException ie){
//ignore
}
因爲如果你這樣做,你有沒有停止的消息。相反,一個人應該做的
Catch(InterruptedException ie){
Thread.currentThread().interrupt();//preserve the message
return;//Stop doing whatever I am doing and terminate
}
如果您處於頂級水平 - 或能夠乾淨地獲得到最高級別 - 線程,那麼只是返回是很好的。拋出一個異常並不是那麼幹淨,因爲你需要能夠檢查沒有任何東西會捕獲異常並忽略它。
你需要爲了調用interrupt()
使用Thread.currentThread()
的原因是,interrupt()
是一個實例方法 - 你需要調用它要中斷線程,而你的情況正好是在當前線程上。請注意,只有在下一次線程阻塞時(例如,IO或監視器)纔會注意到中斷 - 這並不意味着立即拋出異常。
@Downvoter:你能解釋一下你不喜歡我的答案嗎? – 2010-03-22 11:40:57
線程是一個類,而不是一個實例; currentThread()是一個靜態方法,它返回與調用線程相對應的Thread實例。
使用(2)。 interrupt()對於正常使用來說有點殘酷。
如果run方法結束,線程將結束。
如果你使用一個循環,一個適當的方式就像是以下幾點:
// In your imlemented Runnable class:
private volatile boolean running = true;
public void run()
{
while (running)
{
...
}
}
public void stopRunning()
{
running = false;
}
返回當然是最好的辦法。
@Martijn:你需要讓'running'變得不穩定,否則你有一個併發錯誤。 – 2010-03-22 11:14:01
@Zwei:只有當你想從另一個線程發出信號時 - 在這種情況下,它聽起來像線程本身知道(在某個時刻)它應該停止。 – 2010-03-22 11:41:28
@Jon:不管情況如何,如果stopRunning()是'public',我個人認爲使用非易失性標誌是非常危險的。你可以很容易忘記,從另一個線程調用stopRunning(),並有一個非常討厭的bug ... – 2010-03-22 12:22:23
如果你簡單地調用interrupt()
,該線程將不會自動關閉。相反,如果isInterrupted()
相應地實施,線程甚至可以繼續生活。只有這樣,才能guaranteedly 接近一個線程,由OP要求,是
Thread.currentThread().stop();
方法已過時,但是。
調用return
只從當前方法返回。如果您處於頂級水平,這隻會終止該線程。
不過,您應該使用interrupt()
並圍繞它構建代碼。
最後部分:爲什麼我需要在中斷線程毫秒前調用中斷? :) – JacksOnF1re 2015-08-28 19:21:50
@ JacksOnF1re:因爲以其無限的智慧,Java決定當'InterruptedException'被拋出時,中斷標誌被設置爲false。即除非你調用中斷,調用者不會注意到線程被中斷,因爲'isInterrupted'將開始返回false。 – 2015-08-29 03:09:17