简述ForkJoinPool.commonPool()

前言

  • 在有些并发工具类中,如果我们没有传递线程池,那么将使用默认的公共池。如下:
    在这里插入图片描述

  • ForkJoinPool.commonPool() 是 Java 中 ForkJoinPool 的一个公共静态实例,它与传统的线程池(如 ThreadPoolExecutor)在一些概念上既有相似之处,也有不同之处,下面来详细分析其是否有最大线程数、队列、拒绝策略的概念。

最大线程数

  • 有类似概念ForkJoinPool.commonPool() 有并行度(parallelism)的概念,它类似于最大线程数。并行度决定了 ForkJoinPool 中可以同时执行的任务数量。
  • 默认值:默认情况下,并行度的值等于系统的可用处理器核心数减 1(Runtime.getRuntime().availableProcessors() - 1),但最小值为 1。可以通过系统属性 java.util.concurrent.ForkJoinPool.common.parallelism 来调整默认并行度。例如,在启动 JVM 时添加 -Djava.util.concurrent.ForkJoinPool.common.parallelism=8 可以将公共池的并行度设置为 8。
  • 动态调整ForkJoinPool 会根据任务的执行情况动态调整线程数量,但不会超过并行度的限制。

队列

  • 有任务队列ForkJoinPool每个工作线程维护了一个双端队列Deque),称为工作队列(work queue)。
  • 工作窃取算法:与传统线程池的单队列不同,ForkJoinPool 使用工作窃取算法。每个工作线程会从自己的工作队列头部取出任务执行,当自己的队列空了,它会从其他线程的工作队列尾部窃取任务。这种设计减少了线程之间的竞争,提高了并行性能。
  • 任务提交方式:外部提交的任务会被放入一个全局队列中,工作线程会从全局队列中获取任务并放入自己的工作队列。而 ForkJoinTask 通过 fork() 方法拆分的子任务会被放入执行该任务的线程的工作队列。

拒绝策略

  • 无传统意义的拒绝策略:传统的线程池(如 ThreadPoolExecutor)有明确的拒绝策略,当任务队列已满且线程池达到最大线程数时,会根据拒绝策略处理新提交的任务。但 ForkJoinPool.commonPool() 没有传统意义上的拒绝策略。
  • 阻塞机制ForkJoinPool 不会拒绝新提交的任务。当所有线程都在忙碌且没有空闲线程时,新提交的任务会被放入队列等待执行。如果队列也满了,提交任务的线程会阻塞,直到有线程空闲并可以处理新任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值