我試圖停止當前線程,更改run()方法,然後重新啓動該線程。我環顧四周,大多數方法都被棄用了。但是,interrupt()不是。我不確定這是你需要做的。停止並重新啓動線程
interrupt();
start();
這樣可以滿足我需要的嗎?它說,你不應該啓動一個線程不止一次,我不知道這是否意味着
start();
start();
而不是我想做的事。
任何幫助表示讚賞。
感謝
我試圖停止當前線程,更改run()方法,然後重新啓動該線程。我環顧四周,大多數方法都被棄用了。但是,interrupt()不是。我不確定這是你需要做的。停止並重新啓動線程
interrupt();
start();
這樣可以滿足我需要的嗎?它說,你不應該啓動一個線程不止一次,我不知道這是否意味着
start();
start();
而不是我想做的事。
任何幫助表示讚賞。
感謝
請勿重新啓動線程。你總是可以重寫你的buisness邏輯來做其他的一些事情。考慮使用SingleThreadExecutor
調用interrupt()
將設置線程的中斷狀態可能中斷阻塞的方法。這是合作取消機制的一部分。你不能用它強制線程停止運行。
停止線程已被棄用的原因是:它本質上是危險的,因爲它可能會使狀態變量處於不一致的狀態。
你不應該這樣做。將您的代碼從run()
方法轉換爲Runnable
,並將其提交至Executor
。這將返回Future
您可以使用它來檢索其結果以及取消它。
如果您想在其他計算中重複使用相同的線程,請使用線程池,例如參見Executors.newFixedThreadPool()
和Executors
中的其他工廠方法。
一旦你開始一個線程,你只能中斷它。一旦你這樣做了,你不能再啓動它。有關更多詳細信息,請參見here。
我不太清楚你想做什麼,但它聽起來像你有不同的Runnables,你想按順序運行。在這種情況下,請使用SingleThreadExecutor並提交您的Runnables。它將以的順序運行這些,因此中斷第一個(成功)將調用第二個。
我仍然不確定這是一個好主意(它聽起來不對),也許發佈更詳細的問題描述會讓人們更清楚自己真正想要做什麼。
不,你不能那樣做。 Fron the java online docs:
多次啓動線程永遠不合法。特別是,線程一旦完成執行就不會重新啓動。
在這種情況下,您應該創建一個Runnable對象並將其傳遞給線程。然後你創建不同的線程,但重新使用「工作」對象。
您應該更深入地瞭解線程的基礎知識。一個線程只能運行一次。如果你想讓線程運行不同的代碼,你需要創建一個新的線程。
interrupt()方法不會立即停止線程(沒有支持)的方式來做到這一點,它只會通過拋出InterruptedException()來停止某些點。
我認爲你是以錯誤的方式接近你的問題。你不能'更改線程的run()方法'。然而你可能想要的是停止前一個線程並用不同的run()方法創建一個新線程。
但是,要記住的一件事是線程被設計爲儘可能自治,他們不喜歡來自其他線程的干擾,這就是爲什麼suspend()和resume()不推薦使用。他們根據情況創造各種不良行爲,也容易陷入僵局。
你有2個絕對安全的替代品。然而:特定的共享對象
您需要在運行中決定()方法,它是安全的「一站式」的線程,在這一點上放一個wait()或睡眠( )。你的線程只會停在那一點。
然後其他線程可以執行notify()或sleep(),以便運行線程得到通知或中斷。在interrupt()的情況下,你會得到一個InterruptedException,你可以用它來終止你在那個線程中做的事情。
中斷舊線程後,您可以啓動一個新線程,並使用具有不同run()方法的新Runnable實現進行初始化。
不知道你的意思是改變運行方法。你可以通過sleep()獲得一個線程暫停。要停止線程,最好通過完成run()方法來終止線程。然後,如果你想使用線程,你會創建一個新的線程。否則,如下使用執行者。 – Davos555 2011-12-28 12:23:52