任务性质类型
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