簡體   English   中英

Fork-Join線程池中的長時間運行任務是否可以阻止所有線程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM