2011-09-05 40 views
1

我正在研究java中的多線程遊戲。我有幾個工作線程從中央線程管理器獲取模塊,然後自行執行它。現在我想暫停這樣一個線程,如果它暫時沒有任何執行。我已經嘗試從線程管理器調用它的wait()方法,但這隻會導致它忽略跟隨它的notify()調用。如何根據需要暫停Java線程?

我用Google搜索一下就可以了太多,只發現大多數網站是指功能,如暫停(),暫停()等,這些現在被標記一個過時的Java文檔頁面。

所以一般情況下,按需要暫停或繼續線程的方式是什麼?

回答

4

您可以在螺紋處,如果你想停止線程的動作被設置爲false前哨變量使用if塊。如果線程正在執行循環,這效果最好。

1

有很多方法可以做到這一點,但最常見的(IMO),工作線程調用wait()工作隊列中,而工作發生器應調用notify()。這會導致工作線程停止,沒有線程管理器執行任何操作。見例如this article on thread pools and work queues

2

也許我錯過了點,但如果他們什麼都沒有做,爲什麼不乾脆讓他們死?然後在你有工作再做一次時產生一個新線程。

這聽起來像你想要雙方的對話。在我的(謙虛)意見中,你應該讓工作者線程負責要求中央線程管理器工作(或'模塊'),或者你應該讓中央線程管理器負責分配工作並開始工作線程。

它聽起來像是大多數時候工作線程負責請求工作。然後,有時候,責任轉向線程經理,告訴工人不要問一段時間。如果這個責任只停留在一邊,我認爲這個系統會更簡單。

因此,考慮到這一點,並用我有限的你開發什麼樣的知識,我會建議之一:

有工作線程的線程管理器踢時,有事情要做,而且保持自己的進步軌跡,讓他們在完成任務時死亡,只有在有新事情發生時才創造新事物。或

一直存在的工作線程輪詢的工作線程管理器和集數(如果沒有的話)使用的Thread.sleep()重試前一段時間的睡眠。這對我來說似乎很浪費,所以我會傾向於選擇1,除非你有充分的理由不去?

+0

這是一個很好的觀點,但它仍然會迫使我讓遊戲的主線程在睡眠或喚醒時等待所有模塊執行。另外,由於每個模塊(例如AI,動畫,3D渲染器,腳本)都需要發送有關完成的反饋,爲什麼不讓他們立即嘗試獲得新的工作?你確實有一個公平點。我認爲它結束了:)但最終哨兵是我實際上尋找的。 – Bartvbl

+0

夠公平 - 但我認爲這絕對是可行的,沒有任何線程必須睡覺。你是對的,沒有理由工人不應該在另外一個工作崗位上等待。我認爲KarlP是正確的 - 使用ExecutorService。 Java已經擁有一些優秀的併發庫時,不需要重新發明輪子。 – Russell

+0

的一部分就是我也想了解這些東西。因此,編程明智可能會更容易,但它是「之前使用它」我以後。當然,我可以完美地讓線程死亡,如果他們不能在某個時候獲得工作,並在有更多可用時重新生成線程。 – Bartvbl

1

使用阻塞隊列使用take()

poll(time,unit)要超時的等待獲取這些模塊,從而可以正常關閉

這些將阻止當前線程,直到一個模塊可用