ForkJoin框架原理

任务性质类型

CPU密集型

CPU密集型也叫计算密集型,系统的硬盘、内存性能相对于CPU会好很多,此时系统运作大部分的状况是CPU Loading 100%、CPU要读写I/O(硬盘、内存),I/O在很短的时间内就可以完成,而CPU还有许多运算要处理,CPU Loading很高。

在大部分系统中,大部分时间用来做计算、逻辑判断等CPU动作的程序成为CPU bound。

CPU bound的程序一般CPU使用率比较高。这可能是任务本身不太需要访问I/O设备,也可能是程序是由多线程实现减少了等待的时间。

线程数=CPU核数+1

IO密集型

指的是系统的CPU性能相对于硬盘、内存要好很多,此时,系统运作大部分状况是CPU在等待IO(硬盘、内存)读写操作,此时的CPU Loading不高。

线程数=(线程等待时间+CPU执行时间)/CPU执行时间*CPU核数

什么是ForkJoin框架?

ForkJoin是java1.7才引入的,由大神Doug Lea写的。提供了一个用于并行执行任务的框架,把一个大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。

Fork/Join特性:

ForkJoinPool并不是为了取代ExecutorService,而是对它的补充,某些场景下使用Fork/Join更合理

工作窃取算法

ForkJoin源码分析

ForkJoinPool构造器参数:

parallelism:池子中工作线程数
factory:线程工厂
handler:内部运行错误处理
asyncMode:每个工作线程都有一个独立的队列,表示工作线程内的任务队列是采用何种方式进行调度,可以是先进先出,也可以是后进先出,如果为true,则是先进先出,默认是false

猜你喜欢

转载自blog.csdn.net/dhj199181/article/details/115151089
今日推荐