2014-10-27 78 views
0

假設控制線程可以訪問一堆線程和該線程等待的對象。如果我必須從這個單一的控制線程開始和停止,這些線程中有幾個正在做什麼,哪一個會對性能產生更大的影響?創建和查殺線程與使用.notify()和.wait()

難道只是通過中斷殺死它並僅僅使用相同的Runnable創建一個新的更好?

+0

'notify()'和'wait()'都不是創建或終止線程的方法。我認爲你應該回去仔細閱讀基本面。如果你喜歡書籍,Java Concurrency In Practice是一個很好的例子。 – yshavit 2014-10-27 04:08:50

+1

'notify()'和'wait()'不會啓動或停止線程,它們被用作[monitor](https://en.wikipedia.org/wiki/Monitor_(synchronization))的一部分來暫停執行並重新開始同步。另外,Java線程上的'stop()'方法已被棄用,可能無法工作,或執行未定義的行爲。我建議你避免單獨的線程對象並使用[ExecutorService](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html),您可以將Runnable任務添加到,並從那裏控制執行。 – Afforess 2014-10-27 04:10:45

+0

是的,我知道。我想表達錯誤。我的意思是,如果我不得不暫停執行它不是更好,例如通過中斷它來殺死它,並創建一個具有相同可運行的新的? – MAG 2014-10-27 04:34:17

回答

1

創建(實際上是start() -ing)一個新線程相對昂貴,因此從性能角度來看,最好使用wait/notify。其他,interrupt不保證「停止」一個線程。線程可能會選擇忽略中斷,或者如果它純粹是CPU綁定的,它可能根本不會注意到它。

還有第三種選擇:使用現有的線程池機制。例如,ExecutorService API具有提供有界和無界線程池的各種實現。這些可以照顧放大和縮小,並關閉池。您可以通過submit(...) -ing任務將它們用作Runnable實例,並且您可以選擇使用Future,這樣您可以等待任務完成。

最後,對於大多數併發編程用例,有標準類支持用例,最好使用它們而不是嘗試從頭開始實現;例如直接使用wait/notify。就你而言,你可能需要某種「屏障」機制:java.util.concurrent.Phaser可能是你需要的。

0

線程彼此之間相當獨立,在大多數情況下,每個線程在準備終止時都會比控制線程知道更多。殺死一個線程是非常突然的事情,等待威脅清理乾淨要好得多。

相關問題