2011-09-03 57 views
0

我有一個線程,它只是一次任務。如果在適當的時間無法做到這一點,我想阻止它。我怎樣才能做到這一點?我之前見過的所有方法都使用了一個while循環和一個多次完成任務的標誌;但我的任務不是那樣的。java:停止安全線程;不使用while和布爾標誌

謝謝大家。

回答

0

使用java.util.TimerTask類 - 它用於調度一次性或由定時器重複執行的任務。

+0

首先謝謝你。但是:Timer任務有一個取消方法,用於取消它的執行,如果任務在這個調用發生時正在運行,任務將運行到完成,但不會再運行。我想讓任務停止,只是我停止了;我不希望任務在一段時間後不能完成。 – sajad

+0

這工作它的任務是安排,並沒有開始,但不會一次。 – aalku

9

停止任務的唯一干淨方法是中斷它(或設置其他標誌),使線程正常停止。如果您的代碼中沒有外部循環,則可以在可安全中斷工作流程的各個關鍵點檢查它。對於大型代碼庫來說這可能很乏味,但這是最好的方法。

如果你有一個庫你沒有控制你可以使用Thread.stop()但是這可以讓你的應用程序處於一個未定義的狀態。它不殺死線程,但會觸發一個ThreadDeath錯誤,它將展開堆棧並最終調用塊等。問題是它將發生在有效的隨機代碼行中(即使是通過一行代碼的一半) A根據代碼的寫法,線程可以忽略ThreadDeath錯誤。

解決此問題的唯一方法是在另一個進程中運行不受信任的代碼,然後在進程花費太長時間時終止該進程。這可能會留下臨時文件,但是更安全的選擇。

+0

你好,ThreadDeath是如何工作的?它能夠抓住它嗎?如果我們無法捕捉它,這意味着什麼「它不會像這樣殺死線程,而是觸發一個ThreadDeath錯誤,這個錯誤會解開堆棧並最終調用塊等。」 – GMsoF

+0

'ThreadDeath'擴展Error,它可以像任何其他錯誤或Throwable一樣被捕獲(並可能被忽略)。 –

+0

呃..你有想法如何捕捉?我看到Java文檔thread.stop()不會拋出這個異常。 – GMsoF