2011-03-22 88 views
6

如果我在一個Thread對象上使用start()並且run()方法返回,是否可以再次調用start()?我可以在死後再次啓動一個線程嗎?

例如,

MyThread myThread = new MyThread(); 
myThread.start(); 
// run method executes and returns in 2 seconds 
// sleep for 5 seconds to make sure the thread has died 
myThread.start(); 

我只是想知道,因爲我的代碼是拋出IllegalThreadStateExceptions,所以想知道這是否是因爲你不能做到以上。

+2

閱讀javadoc盧克! – 2011-03-22 22:14:06

+0

@Stephen我確實看過javadoc,但是僅用於start()方法,但它沒有使聲音非常清晰。 – Matt 2011-03-22 22:17:39

+0

咦?什麼是不清楚的句子*「在一個叫做'start()'的方法上多次啓動一個線程是不合法的」? – 2011-03-22 22:49:54

回答

11

不,你不能。 Javadoc的Thread.start()方法告訴你!

+0

哎呀..「開始」意味着「已經開始在某個時間點」,而不是「未死」?還有什麼我可以做的重新啓動一個線程? – Matt 2011-03-22 22:13:26

+0

'開始'在哪裏出現?我在看的文件說:「多次啓動一個線程永遠不合法」。如果你已經寫了'Runnable'而不是擴展'Thread',那麼執行器框架可以讓你重新提交作業,或者定期運行等。 – dty 2011-03-22 22:15:50

+0

它意味着「已經開始在某個時間點」。 – Greg 2011-03-22 22:16:09

0

根據JavaDoc:

這是從來沒有的法律,以啓動一個線程 不止一次。特別是,一旦 完成執行, 線程可能無法重新啓動。

查看Thread.start() javadoc瞭解更多信息。

還有其他方法可以完成您正在嘗試做的事情。例如,您可以使用新的線程來繼續在已完成執行的線程中完成的工作。您可能還想調查java.util.concurrent package

4

從評論:

還有什麼我能做的重新啓動一個線程?

您可以使用ThreadPoolExecutor,這將允許您傳遞任務並讓該服務將線程分配給任務。任務完成後,該線程將處於空閒狀態,直到獲得下一個任務。

所以,你不重啓一個線程,但你會重做/恢復一個任務。

-1

如果您希望線程停止並重新啓動多次,也許有更好的方法來做到這一點。我在C++中有一個tile緩存線程,它執行類似的操作;它在完成時暫停,在需要時暫停。我是Java的新手,但從我所知道的情況來看,您可以使用Object.wait()暫停,並使用Object.notify()來恢復線程。也許你可以在文檔中檢查出來,並重新設計你的線程暫停和恢復,而不是退出。

+0

不知道爲什麼你會低估它......它在C++中起作用......每當你需要相同的線程時開始一個新的線程是一種浪費...如果你需要相同的線程來保留它自己,最好是隻需暫停並恢復它。 – TurtleToes 2011-03-22 23:34:35

+1

使用'wait'和'notify'完全是停止線程以用於執行多個任務的錯誤方法。順便說一句,順便說一下,就是使用一個執行器(如ThreadPoolExecutor)爲你做線程停放。 – 2011-03-24 06:48:56

相關問題