2015-03-31 22 views
4

我創建命名爲ThreadClass(這是因爲你可以看到一個線程)一個下面的類,它的結構是一樣的東西下面使用Thread.stop(),最後

class SomeTask implements Runnable 
{ 
    boolean someCondition=true; 
    public void run() { 
     try 
     { 
      while(someCondition) 
      { 
      //Here goes the Process Code 
      } 
     } 
     catch(Exception errorException) 
     { 
      //Catching the Exception 
     } 
     finally 
     { 
      ////I expect that this finally should run every time ,whatever happens in the world 
     } 
    } 

} 

我的問題是關於終於塊和停止()方法

如上類實現Runnable,所以我可以創建這個類的對象,並通過調用啓動(啓動它的一個線程) method.I也很清楚知道的我可以停止這個事實使用停止()是的,我知道它已被棄用)的方法。

我想澄清自己的是,如果不知何故,我需要調用stop方法ThreadClass的對象上,然後我可以依靠終於塊即使線程停止執行調用停止( ),因爲我在finally塊中做了一些重要的關閉事情。

+2

@nobalG我想你是部分問錯了問題。應該沒有「如果我需要調用已棄用的方法」。以不需要棄用方法的方式設計您的應用程序。那麼你不必考慮如果你打電話給他們會發生什麼。 – GhostCat 2015-03-31 06:36:51

+0

實現'myStop()'方法會不會更好,它會將條件設置爲'false',所以while循環實際上停止了嗎?即使你需要在你停下來的時候再運行它,你可以保存你的變量/狀態,並繼續從 – Loki 2015-03-31 06:37:46

+0

@EddyG我知道我可以做到這一點,我只是在這個特殊情況下要求 – nobalG 2015-03-31 06:38:41

回答

3

線程#停止通過拋出一個ThreadDeath異常來工作,它並不會像System.exit一樣吹走JVM。 ThreadDeath甚至可以被捕獲,儘管這不是一個好主意。所以嘗試塊仍然相關。

但是,如果線程停止多次調用,那麼如果在線程處於finally塊中時調用第二個停止,那麼它可能會從finally塊中拋出,以致finally塊那麼就不會完成。如果線程的清理需要一段時間,那麼停止可能會被多次調用。

或者即使您只調用一次停止,如果在停止被調用的時候線程碰巧已經在執行它的finally塊,那麼停止將干擾完成finally塊。

這類似於什麼technotes on Thread primitive deprecation點出:

1)一個線程可以拋出一個ThreadDeath異常幾乎任何地方。考慮到這一點,所有同步的方法和模塊都必須進行詳細研究。

2)一個線程可以拋出第二個ThreadDeath異常,同時從第一個清除(在catch或finally子句中)。清理將不得不重複,直到成功。確保這一點的代碼將非常複雜。

因此,有些情況存在問題,要確保清理工作得到正確完成是非常困難的。詹姆斯的評論是正確的,如果可能的話,你應該使用中斷這種事情,以便線程能夠可靠地完成其業務。

+0

謝謝....................... – nobalG 2015-04-02 10:55:57