2011-12-28 243 views
1

我試圖停止當前線程,更改run()方法,然後重新啓動該線程。我環顧四周,大多數方法都被棄用了。但是,interrupt()不是。我不確定這是你需要做的。停止並重新啓動線程

interrupt(); 
start(); 

這樣可以滿足我需要的嗎?它說,你不應該啓動一個線程不止一次,我不知道這是否意味着

start(); 
start(); 

而不是我想做的事。

任何幫助表示讚賞。

感謝

+0

不知道你的意思是改變運行方法。你可以通過sleep()獲得一個線程暫停。要停止線程,最好通過完成run()方法來終止線程。然後,如果你想使用線程,你會創建一個新的線程。否則,如下使用執行者。 – Davos555 2011-12-28 12:23:52

回答

3

請勿重新啓動線程。你總是可以重寫你的buisness邏輯來做其他的一些事情。考慮使用SingleThreadExecutor

1

調用interrupt()將設置線程的中斷狀態可能中斷阻塞的方法。這是合作取消機制的一部分。你不能用它強制線程停止運行。

停止線程已被棄用的原因是:它本質上是危險的,因爲它可能會使狀態變量處於不一致的狀態。

你不應該這樣做。將您的代碼從run()方法轉換爲Runnable,並將其提交至Executor。這將返回Future您可以使用它來檢索其結果以及取消它。

如果您想在其他計算中重複使用相同的線程,請使用線程池,例如參見Executors.newFixedThreadPool()Executors中的其他工廠方法。

1

一旦你開始一個線程,你只能中斷它。一旦你這樣做了,你不能再啓動它。有關更多詳細信息,請參見here

我不太清楚你想做什麼,但它聽起來像你有不同的Runnables,你想按順序運行。在這種情況下,請使用SingleThreadExecutor並提交您的Runnables。它將以的順序運行這些,因此中斷第一個(成功)將調用第二個。

我仍然不確定這是一個好主意(它聽起來不對),也許發佈更詳細的問題描述會讓人們更清楚自己真正想要做什麼。

4

不,你不能那樣做。 Fron the java online docs

多次啓動線程永遠不合法。特別是,線程一旦完成執行就不會重新啓動。

2

在這種情況下,您應該創建一個Runnable對象並將其傳遞給線程。然後你創建不同的線程,但重新使用「工作」對象。

1

您應該更深入地瞭解線程的基礎知識。一個線程只能運行一次。如果你想讓線程運行不同的代碼,你需要創建一個新的線程。

interrupt()方法不會立即停止線程(沒有支持)的方式來做到這一點,它只會通過拋出InterruptedException()來停止某些點。

1

我認爲你是以錯誤的方式接近你的問題。你不能'更改線程的run()方法'。然而你可能想要的是停止前一個線程並用不同的run()方法創建一個新線程。

但是,要記住的一件事是線程被設計爲儘可能自治,他們不喜歡來自其他線程的干擾,這就是爲什麼suspend()和resume()不推薦使用。他們根據情況創造各種不良行爲,也容易陷入僵局。

你有2個絕對安全的替代品。然而:特定的共享對象

  1. 使用wait()和notify()。
  2. 使用睡眠()和中斷()

您需要在運行中決定()方法,它是安全的「一站式」的線程,在這一點上放一個wait()或睡眠( )。你的線程只會停在那一點。

然後其他線程可以執行notify()或sleep(),以便運行線程得到通知或中斷。在interrupt()的情況下,你會得到一個InterruptedException,你可以用它來終止你在那個線程中做的事情。

中斷舊線程後,您可以啓動一個新線程,並使用具有不同run()方法的新Runnable實現進行初始化。