当前位置: 首页 > 知识库问答 >
问题:

为什么parallelStream使用ForkJoinPool,而不是普通的线程池?

仲孙俊贤
2023-03-14

参考Java的Fork/Join vs ExecutorService-何时使用哪个?,传统的线程池通常用于处理许多独立请求;ForkJoinPool用于处理连贯/递归任务,其中一个任务可能会产生另一个子任务并稍后加入。

那么,为什么Java-8的并行流默认使用ForkJoinPool而不是传统的执行器?

在许多情况下,我们在stream()并行Stream()之后使用foreach(),然后提交一个函数式接口作为参数。从我的角度来看,这些任务是独立的,不是吗?

共有1个答案

农明辉
2023-03-14

重要的一点是,ForkJoinPool也可以执行“正常”任务(例如,可运行的、可调用的),因此它不仅仅用于递归创建的任务。

另一件(重要的)事情是,ForkJoinPool有多个队列,每个工作线程一个队列,用于任务,其中一个普通执行器(例如ThreadPoolExecutor)只有一个队列。这对他们应该运行何种任务有很大影响。

正常执行者必须执行的任务越小、越多,将任务分配给工作者的同步开销就越高。如果大多数任务都很小,工作人员将经常访问内部任务队列,这会导致同步开销。

这里是ForkJoinPool的亮点,它有多个队列。每个worker只从自己的队列中获取任务,大部分时间不需要通过阻塞来同步,如果队列为空,它可以从另一个worker窃取任务,但可以从队列的另一端窃取任务,这也很少导致同步开销,因为偷取工作应该非常罕见。

那么这与并行流有什么关系呢?流框架旨在易于使用。当您想在许多并发任务中轻松拆分某些内容时,应该使用并行流,其中所有任务都相当小且简单。这就是ForkJoinPool是合理选择的地方。它在大量较小的任务上提供了更好的性能,如果有必要,它也可以处理较长的任务。

 类似资料:
  • 将并行流执行提交到您自己的forkJoinpool:yourfjp.submit(()->stream.parallel().foreach(doSomething)); 所以,我这样做了: 我创建了一组线程名,以查看创建了多少线程,并记录了池中活动线程的数量,这两个数字都不超过16,所以这意味着这里的并行度不超过16(为什么甚至是16?)。如果我不使用forkJoinPool,我得到4作为并行度

  • 此答案指示如何将转换为,同时管理将发生阻塞的位置: 我的问题和评论中的问题一样: 怎么了?为什么你使用一个额外的线程与Promise结合? 答复如下: 它会在你拉线的时候卡住线。如果您已经为这样的未来配置了ExecutionContext,这很好,但是默认的ExecutionContext包含的线程与您拥有的处理器一样多。 我不确定我是否理解这个解释。重申: 有什么问题?在未来内部阻塞不是和手动创

  • 当我运行以下代码时,8个可用线程中只有2个运行,有人能解释为什么会这样吗?我如何以这样一种方式更改代码,它将利用所有8个线程? 处理器:8 [main]向1 [main]树发送命令,其中数据1为真 [main]向6 [forkjoinpool.commonpool-worker-2]发送命令到5 [main]树,其中数据6为真 [forkjoinpool.commonpool-worker-2]树

  • 问题内容: 这里的快速问题:为什么不总是在Java中使用ArrayLists?除了额外的有用功能之外,它们显然具有与数组相同的访问速度。我理解它的局限性,因为它不能容纳原语,但是可以通过使用包装程序轻松地减轻这种情况。 问题答案: 如果需要原始类型的集合,那么数组很可能是完成这项工作的最佳工具。装箱是比较昂贵的操作。对于将用作图元的图元集合(不包括地图),我几乎总是使用数组来避免重复装箱和拆箱。

  • 问题内容: 我正在查看此代码以Java 进行计算。他们为什么在某些循环中使用十六进制值,而对于变量却使用常规值?使用十六进制有什么好处? 问题答案: 因为十六进制对应的位数比十进制数更紧密。每个十六进制数字对应于4位(半字节)。因此,一旦您了解了与每个十六进制数字(0-F)相关的位掩码,就可以执行“我想要低位字节的掩码”之类的操作: 或者,“我想为低31位使用掩码”: 仅供参考:

  • 本文向大家介绍请为什么说js是单线程,而不是多线程呢?相关面试题,主要包含被问及请为什么说js是单线程,而不是多线程呢?时的应答技巧和注意事项,需要的朋友参考一下 JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript