2015-03-19 108 views
1

我有使用框架struts2和Tomcat的J2EE項目。有兩個動作:「開始任務」和「停止任務」。據我瞭解,當用戶運行任務「啓動任務」時,Tomcat啓動執行任務的線程。用戶可以單擊「停止任務」,然後Tomcat啓動第二個線程,以停止第一個線程。執行任務的方法非常大。有查詢數據庫和計算。爲了停止線程,我使用第一個線程的interrupt(),但interrupt()只是更改標誌的值,但方法中的代碼繼續運行。我在方法的不同部分檢查中斷標誌(Thread.currentThread().isInterrupted()),如果線程中斷,我使用「return」。有沒有其他方法?如何在Java中的線程中停止執行該方法?

+0

這是如何工作的,)你只能問其他線程停止執行(與中斷()方法),而且它是由被中斷的線程就如何將這種中斷 – pomkine 2015-03-19 10:12:45

回答

1

你的實現是正確的。建議您使用的方式。其他的方法是使用Thread.stop(),但是這個方法自java 1.1以後不推薦使用,也沒有人應該使用它。這種方法類似於Unix中的kill -9,即它只是殺死可能導致程序進入不一致狀態並可能產生資源泄漏的線程。

很明顯,你可以改善你的設計。你說這個方法非常大。一般方法不應超過20行。那麼,50是最大的。如果您的方法如此之大,請將其分解爲更小的任務,並在每項任務之前檢查isInterrupted()

前進到面向對象的世界:使用方法perform()創建接口Task。 (名稱無關緊要,您可以選擇其他名稱)。 每個子任務應該在單獨的類中實現,並應實現此接口。然後創建專門的InterruptionChecker,實現Task並持有其他任務。它檢查線程是否中斷,如果沒有,則運行有效負載任務。這種模式被稱爲包裝或修飾器。

現在你的「大」的方法應該只運行循環中的所有任務。當線程被破壞時,沒有新的任務被執行。

+0

迴應感謝您的答覆。你非常幫我設計代碼! – Katerina 2015-03-19 11:16:41

+0

所以,不要猶豫,接受答案:) – AlexR 2015-03-19 11:45:58