2010-03-22 53 views
56

這是一個簡短的問題。在某個時候,我的線程明白它應該自殺。什麼是最好的辦法:線程應該如何在Java中自行關閉?

  1. Thread.currentThread()。interrupt();
  2. return;

順便說一下,爲什麼在第一種情況下我們需要使用currentThreadThread是否不引用當前線程?

回答

59

如果你想終止線程,那麼只是返回是好的。你不需要調用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 
} 
+0

最後部分:爲什麼我需要在中斷線程毫秒前調用中斷? :) – JacksOnF1re 2015-08-28 19:21:50

+1

@ JacksOnF1re:因爲以其無限的智慧,Java決定當'InterruptedException'被拋出時,中斷標誌被設置爲false。即除非你調用中斷,調用者不會注意到線程被中斷,因爲'isInterrupted'將開始返回false。 – 2015-08-29 03:09:17

5

如果您處於頂級水平 - 或能夠乾淨地獲得到最高級別 - 線程,那麼只是返回是很好的。拋出一個異常並不是那麼幹淨,因爲你需要能夠檢查沒有任何東西會捕獲異常並忽略它。

你需要爲了調用interrupt()使用Thread.currentThread()的原因是,interrupt()是一個實例方法 - 你需要調用它要中斷線程,而你的情況正好是在當前線程上。請注意,只有在下一次線程阻塞時(例如,IO或監視器)纔會注意到中斷 - 這並不意味着立即拋出異常。

+0

@Downvoter:你能解釋一下你不喜歡我的答案嗎? – 2010-03-22 11:40:57

1

線程是一個類,而不是一個實例; currentThread()是一個靜態方法,它返回與調用線程相對應的Thread實例。

使用(2)。 interrupt()對於正常使用來說有點殘酷。

14

如果run方法結束,線程將結束。

如果你使用一個循環,一個適當的方式就像是以下幾點:

// In your imlemented Runnable class: 
private volatile boolean running = true; 

public void run() 
{ 
    while (running) 
    { 
     ... 
    } 
} 


public void stopRunning() 
{ 
    running = false; 
} 

返回當然是最好的辦法。

+5

@Martijn:你需要讓'running'變得不穩定,否則你有一個併發錯誤。 – 2010-03-22 11:14:01

+0

@Zwei:只有當你想從另一個線程發出信號時 - 在這種情況下,它聽起來像線程本身知道(在某個時刻)它應該停止。 – 2010-03-22 11:41:28

+1

@Jon:不管情況如何,如果stopRunning()是'public',我個人認爲使用非易失性標誌是非常危險的。你可以很容易忘記,從另一個線程調用stopRunning(),並有一個非常討厭的bug ... – 2010-03-22 12:22:23

3

如果你簡單地調用interrupt(),該線程將不會自動關閉。相反,如果isInterrupted()相應地實施,線程甚至可以繼續生活。只有這樣,才能guaranteedly 接近一個線程,由OP要求,是

Thread.currentThread().stop(); 

方法已過時,但是。

調用return只從當前方法返回。如果您處於頂級水平,這隻會終止該線程。

不過,您應該使用interrupt()並圍繞它構建代碼。

相關問題