2014-05-21 50 views
0

我有兩個線程:ABJava:停止從另一個線程的線程中的所有活動

有螺紋A無限循環:

while (true) { 
    // Do something 
} 

主題B被監測的一些感興趣的狀態給我。當狀態改變時,我想要線程A停止任何進一步的執行。

下述溶液是不夠的(在A其從B稱爲設定keepRunningtrue與方法):

while (keepRunning) { 
    // Do something 
} 

我不能等待的循環體,以螺紋A之前執行被暫停 - 我想要中斷循環中調用的方法的執行。

有沒有辦法實現上述功能?

+1

'//做些什麼?'究竟發生了什麼?如果你告訴我們這些,我們可以給出更具體的建議。 – merlin2011

回答

1

您可以做幾點修復,例如在A的循環中的關鍵點檢查keepRunning。你也可以中斷線程A,它只有在它調用任何拋出InterruptedException的方法時纔會幫助你。

但是,你不能只是讓線程在它的軌道上停下來,並且有很好的理由:這很容易發生死鎖。曾經有一種方法Thread.stopThread.suspend那樣做,they've been deprecated因爲這些危險。從Java 8開始,該方法爲throws UnsupportedOperationException

基本上,線程必須自行停止。它可以根據其他線程的請求(通過字段keepRunning或中斷進行通信)來完成,但必須這樣做。一個線程不能直接阻止另一個線程。

+0

我想你的意思是不推薦使用的Thread.suspend方法。 – Niemand

+0

其中一個,實際上。 – yshavit

+1

我選擇了「檢查關鍵點」的建議,結果並沒有那麼糟糕 - 我只有其中的6個。謝謝 – Vasiliy

1

你可以在任何時候中斷線程,但是這隻會觸發一個InterruptedException在方法中應該檢查這個。

但是,您可以嘗試停止線程,但這是一個不安全的操作,因爲它可能在任何時候發生,除非您非常小心,否則可能會使內存處於不一致狀態。如果你要小心,你可以添加一些檢查並儘早停止代碼。

1

這是一個非常糟糕的主意,因爲當有關鍵資源打開時會發生什麼,例如,一份文件?它不會被關閉:

while (keepRunning) { 
    openFile(); 
    // gets stopped here 
    closeFile(); 
} 

這當然可以與其他的事情發生,以及,操作系統進程,網絡插座,任何東西。你明白爲什麼這是一個壞主意?

您應該重新設計循環中的代碼,以便更頻繁地檢查條件並在條件不成立的情況下中斷並清理。

while (keepRunning) { 
    openFile(); 
    doLongOperation(); 
    if (!keepRunning) { 
     closeFile(); 
     break; // or return 
    } 
    doAnotherLongOperation(); 
    closeFile(); 
} 

這樣,您不會失去安全性,同時能夠更快地停止它。

您可能實際上並不使用寶貴的資源,但無論如何您應該告訴我們更多的細節,以便我們可以給出更準確的答案。