2011-10-21 65 views
0

我有2個班,鐵的Class1和Class2中Java線程通知

比方說,我在Class1的做到這一點:

Class2 class2 = new Class2(); 
Thread thread = new Thread(class2); 
thread.start(); 
... 
thread.stop(); 

現在我想在Class2中的run方法來檢查我的線程停止時,我怎樣才能做到這一點? 所以當class1的停止線,我希望得到一些警惕的Class2,它停下來,然後做一些事情

+2

您是否閱讀過'Thread.stop'的API文檔?他們很認真。 –

+0

只需在停止線程後調用class2的方法:thread.stop(); class2.doSomething(); –

+0

那也是我的想法 – user999379

回答

5
  1. 不要使用stop(),使用interrupt()

  2. 如果你聽從1點,在Class2你可以使用:


public void run() { 
    if(Thread.currentThread().isInterrupted()) 
    //somebody interrupted me, ouch! 
} 
+0

問題不在於如何阻止線程... –

+2

@Thomas Uhrig:它仍然是最好的答案,因爲它完成了所需的任務,並指出了現有代碼中的一個嚴重問題。 –

0

一旦線程已經 「停止」,這意味着該run方法Class2已退出。因此,沒有辦法在執行after線程停止的run方法中擁有代碼。

您可以偵聽中斷並處理該中斷,但是該處理將在線程仍在運行時完成。

您還可以在Class2中使用不同的方法,一旦線程停止,您可以從Class1調用該方法。

2

首先不要使用thread.stop(),因爲它是已棄用。因此取決於這種方法是不可取的。第二:解決它有多種方式,即基本上試圖關機或通信。

  1. 使用通知您的消息的標誌。但要確保整個調用是線程安全的。並及時保持檢查標誌已設置或沒有。如果設置,然後做所需的行動。
  2. 中斷是通知其他線程的完美方式。維護和中斷策略是這樣的:當線程A發生中斷時,A的中斷策略關閉。即每當它收到一箇中斷。使A在A中運行,以便及時檢查中斷以及中斷是否設置爲關閉服務。 檢查狀態 Thread.currentThread().isInterrupted() 通常中斷主要用於通知其他人它正在請求關閉它。 (Brian Goetz的「實踐中的併發」對此有着很好的闡述)。
+3

Thread.stop()不應該被使用的主要原因並不是它已被棄用,而是它爲什麼不被使用的原因:它可以讓應用程序處於不一致的狀態,因爲它不能以某種方式實現尊重代碼中的一致性保證。 –

+0

http://download.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html是一個很好的參考,它爲什麼被棄用。 – Jatin