2015-10-15 29 views
6

ForkJoinPoolForkJoinTask中,當前工作線程是否參與工作竊取?當前員工是否參與偷工作?

我已閱讀的意義,一個叉連接池可以從工作阻塞或等待的線程竊取。目前的工人似乎是一個明顯的人選。一旦工人在另一個任務上調用.join(),那麼該任務基本上被阻止。

另一方面,我看到許多文章暗示不同的結論。例如,目前的工作線程應該在等待分支任務之前工作的普遍共識。

有跡象表明,討論如何利用ForkJoinTask.getSurplusQueuedTaskCount由具有當前工人平衡在隊列中的工作方法的幾篇文章做一些工作。如果當前的工作人員也在偷竊,那麼這似乎不是必要的。

當然,我想最大化線程操作並保持所有工作最大限度地運行。瞭解當前線程是否也在偷竊工作(例如,當調用.join時)將有助於澄清。

+0

你需要一個特定類型的問題,它是最大看到http://stackoverflow.com/questions/7926864/ fork-join-framework-better-a-thread-pool –

+1

我寫了其中一篇文章,我可以保證你的join()不會導致竊取工作http:// coopsoft .com/ar/Calamity2Article.html#join工作竊取僅在deque爲空時有效。就個人而言,我不會用getSurplus來微觀管理框架....等等。 – edharned

回答

2

這是ForkJoinPool管理線程的責任。客戶端代碼應該爲它提供任務,而不是微操作線程。請注意,任務和線程是兩件不同的事情;任務是要執行的工作單元,並且線程執行該工作。如果任務的大小足以從並行運行任務的部分中受益,並且只要任務足夠小以至於能夠更好地運行,那麼只需處理任務,ForkJoinTask.compute()應該將fork()分成更小的子任務在一個單一的線程。如果工作結果超出預期,它可以fork()一些工作,並完成其餘的工作。

如果ForkJoinTask.compute()分叉成更小的子任務,它可以調用join()方法返回之前。然後,ForkJoinPool將釋放該線程以處理其他任務,或者派生一個臨時線程來處理其他任務,以確保可用並行性得到充分利用。

我認爲這是合理的假設,工作線程的適當數量始終處於忙碌狀態,只要有未完成任務的,除非你明確禁止在計算()方法的線程。

太陽教程提供了有關如何使用這些類更多的細節:

https://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html