2013-12-18 483 views
0

我正在使用ExecutorService來啓動多個線程。JAVA線程併發

  • 線程A
  • 線程B
  • 線程C- 和
  • 螺紋d
  • ....
  • .... 螺紋Ñ

所有線程同時開始。 我正在使用ConcurrentHashMap來存儲線程D將來可以使用的線程A,線程B,線程C的結果。

現在可能發生線程A仍在執行時線d正在尋找從線程A輸出

這適用於這可能是依賴於線d的輸出線程C-

這可能是依賴於任何線程的輸出像螺紋N-1,或螺紋或螺紋ňN- 4等等

什麼可能是最好的辦法來處理這種情況,或使線程A等待,直到其他線程準備就緒輸出

+0

我假設你想讓線程D等待給定的輸出線程A正在產生輸出。 –

+2

就個人而言,我可能會在'A'作爲'A'的一部分完成後啓動'D'。但是,如果我沒有記錯,'未來#GET'被攔截... – MadProgrammer

+0

我MadProgrammer同意,把d睡眠,有一個通知它是這個一個完全有效的方式。 – nevets1219

回答

1

我建議有三個任務產生排隊到同一個執行者或另一個執行者的結果。這樣,線程D只有在需要做什麼時才能工作。

一個更好的選擇可能是線程A立即處理自己的工作(和相同的線程B & C)在這種情況下,你不需要線程D.

0

聽起來像是你要使用加盟。啓動後加入線程將有效地使您的程序運行在Liniear方式下。線程A運行,然後B,然後C,然後D將在線程C完成後查找前3個線程的結果。

+0

如果你要做到這一點,爲什麼不直接調用函數A(),B(),C()和d()依次完全避免線程? –

+0

我同意,但你可能希望更多的線程在未來完成類似的任務,同時仍然有D收集結果。 – Slihp