Java技术指南「并发编程专题」Fork/Join框架基本使用和原理探究(原理及源码篇)

本文深入探讨了Java的Fork/Join框架,包括其线程池ForkJoinPool的架构,核心类如ForkJoinTask、WorkQueue和ForkJoinWorkerThread的实现。通过工作窃取算法,Fork/Join框架能够有效利用多处理器资源,提高程序响应和性能。详细解析了ForkJoinPool的构造函数、任务提交过程以及源码中的关键方法,如externalSubmit、signalWork和Work-Steal算法。
摘要由CSDN通过智能技术生成

ForkJoin线程池框架回顾

  • ForkJoin框架其实就是一个线程池ExecutorService的实现,通过工作窃取(work-stealing)算法,获取其他线程中未完成的任务来执行。

  • 可以充分利用机器的多处理器优势,利用空闲的线程去并行快速完成一个可拆分为小任务的大任务,类似于分治算法。

  • ForkJoin的目标,就是利用所有可用的处理能力来提高程序的响应和性能。本文将介绍ForkJoin框架,源码剖析。

ForkJoinPool的类架构图

image

ForkJoinPool核心类实现

  • ForkJoin框架的核心是ForkJoinPool类,基于AbstractExecutorService扩展。
  • ForkJoinPool中维护了一个队列数组WorkQueue[],每个WorkQueue维护一个ForkJoinTask数组和当前工作线程。
  • ForkJoinPool实现了工作窃取(work-stealing)算法并执行ForkJoinTask。

ForkJoinPool,所有线程和WorkQueue共享,用于工作窃取、任务状态和工作状态同步。

image

核心属性介绍
  • ADD_WORKER: 100000000000000000000000000000000000000000000000 -> 1000 0000 0000 0000,用来配合ctl在控制线程数量时使用
  • ctl: 控制ForkJoinPool创建线程数量,(ctl & ADD_WORKER) != 0L 时创建线程,也就是当ctl的第16位不为0时,可以继续创建线程
  • defaultForkJoinWorkerThreadFactory: 默认线程工厂,默认实现是DefaultForkJoinWorkerThreadFactory
  • runState: 全局锁控制,全局运行状态
  • workQueues: 工作队列数组WorkQueue[]
  • config: 记录并行数量和ForkJoinPool的模式(异步或同步)
ForkJoinTask
  • status: 任务的状态,对其他工作线程和pool可见,运行正常则status为负数,异常情况为正数
WorkQueue
  • qlock: 并发控制,put任务时的锁控制

  • array: 任务数组ForkJoinTask<?>[]

  • pool: ForkJoinPool,所有线程和WorkQueue共享,用于工作窃取、任务状态和工作状态同步

  • base: array数组中取任务的下标

  • top: array数组中放置任务的下标

  • owner: 所属线程,ForkJoin框架中,只有一个WorkQueue是没有owner的,其他的均有具体线程owner。

  • WorkQueue 内部就是ForkJoinTask

workQueue: 当前线程的任务队列,与WorkQueue的owner呼应


ForkJoinTask是能够在ForkJoinPool中执行的任务抽象类,父类是Future,具体实现类有很多,这里主要关注RecursiveAction和RecursiveTask。

  • RecursiveAction是没有返回结果的任务

  • RecursiveTask是需要返回结果的任务

image

只需要实现其compute()方法,在compute()中做最小任务控制,任务分解(fork)和结果合并(join)。

image

ForkJoinWorkerThread

ForkJoinPool中执行的默认线程是ForkJoinWorkerThread,由默认工厂产生,可以自己重写要实现的工作线程。同时会将ForkJoinPool引用放在每个工作线程中,供工作窃取时使用。

  • pool: ForkJoinPool,所有线程和WorkQueue共享,用于工作窃取、任务状态和工作状态同步

  • workQueue: 当前线程的任务队列,与WorkQueue的owner呼应


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值