一、ForkJoinPool的概念
1.java7引入了一种新的线程池:ForkJoinPool:它同ThreadPoolExecutor一样,也实现了ExecutorService接口。它使用了一个无线队列保存需要执行的任务,而线程数量是通过构造函数传入,如果没有传入线程数量,计算机的CPU数量会被设置为默认值
2.ForkJoinPool使用分治法(Fork/Join原理),少量线程处理大量任务:例如对1000万数据进行排序,把任务分割成2个500w的排序任务和2个500w数据的合并任务。依次类推,对500W的数据再次分割处理,最后会有个阈值,停止分割处理,例如小于10,会转而使用插入排序对它进行排序。
3.优点:和传统的线程池对比,例如,线程池4个线程,2个线程已完成,2个线程阻塞,然后会继续阻塞下去。而这个线程池,四个线程,每个线程分了n个小任务,形成任务双端队列,fork的时候,会产生新的任务,放到队尾。出现了同样的情况,join的时候,空闲的线程会去其他线程的头部,偷取任务执行,更大的利用cpu,更高效。缺点:会创建大量子任务,导致GC进行垃圾回收。
4.适用场景:最适合计算密集型的任务
二、代码实现