2012-06-29 81 views
0

我有一個擴展線程的XYZ類,它也是一個單例(是的,我的應用程序需要它)。java:停止Singleton線程

在run方法,我有這樣的事情:

public void run() { 
    service.start(); 
} 

花費service.start()是巨大的時間。 此外,我的應用程序並不總是需要線程運行,但不能提前做出決定,所以在啓動應用程序時,我正在啓動該線程。

現在,當應用程序不需要線程時,它會很快完成,我需要做的就是等待線程死亡。

我試圖使用stop()方法,但知道它已被棄用。

回答

1

stop已被棄用很久以前,不應使用。線程終止是Java中的一個協作過程(即中斷代碼在被要求停止時必須執行某些操作,而不是中斷代碼) - 一種方法是在需要中斷的線程上調用thread.interrupt()

然後您需要捕獲運行線程中生成的中斷異常或定期檢查中斷狀態。一旦正在運行的線程檢測到應該停止正在執行的操作,就可以根據需要運行任何清理任務並退出正在執行的任何操作。

+0

但是,運行線程如何檢測到它被中斷? – sachinpkale

+0

這是[單向](http://stackoverflow.com/questions/3194545/how-to-stop-a-java-thread-gracefully?rq=1) - 這是[另一個](http:// stackoverflow.com/a/8649955/829571)。但是@MarkoTopolnik指出,不知道'service.start()'在做什麼,很難說哪種解決方案會更好。理想情況下,如果它拋出InterruptedException(並正確處理它),則可以簡單地中斷它。 – assylias

+0

爲什麼所有這些例子都假設線程正在其運行方法中執行循環? – sachinpkale

0

指示你的線程做清理的東西,你說的反正很快,然後就做一個Thread.join。

0

你的問題是高度依賴於究竟是什麼在service.start()回事。如果它正在打開外部資源,那麼自然你就不能在沒有適當清理的情況下插入並殺死線程。通過適當的清理,start過程需要被明確地編碼以實現可中斷性。

+0

好的。謝謝。但**服務**是外部庫類的對象。我沒有得到適當的清理。 – sachinpkale