![](/img/trans.png)
[英]Executing a long running task using fork-join taking almost same time as single thread program
[英]Can a long running task in a Fork-Join thread pool block all threads?
我一直在學習Java 8的並行流, 這篇文章出現在Google搜索的第一頁上。 我無法理解文章中的這一特定內容
...所有並行流都使用公共fork-join線程池,如果您提交長時間運行的任務,則可以有效地阻止池中的所有線程 。
我無法弄清楚長時間運行的任務如何阻止池中的所有其他線程。
在此語句中,“提交長時間運行的任務”意味着“使用並行流執行長時間運行的任務”。 這是並行流處理的目的 ,將工作拆分並分配到公共線程池的所有工作線程。
此池具有許多配置為使用所有CPU核心的線程,如果所有核心都忙,則已達到該目標。
如果通過等待I / O操作的完成來阻止這些線程,則會出現問題。 然后,不利用CPU核心,這不僅會降低其他並行流的性能,即使在相同的操作中,並發I / O操作的最佳數量可能與CPU核心的數量完全不同。
結論是Stream API不適合並行I / O操作。
提交一個任務不能使用公共池中的所有線程。 common-pool size是core count -1
(主線程為-1)。
我認為在文章中,他的意思是(在API中)不可能將io密集型任務和cpu密集型任務分離到不同的池中。
例如,在8核計算機上,如果向池中提交8個cpu密集型任務,那么8個io密集型任務,io任務必須等待cpu密集型任務完成(反之亦然)。 如果你可以將它們提交到不同的池,則所有16個操作可以同時運行,因為io操作在cpu上並不昂貴。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.