newWorkStealingPool和之前的几种线程池的创建方式有很大的不同,之前定长、单例、缓存、定时任务的四大线程池都是基于ThreadPoolExecutor去实现的。newWorkStealingPool则是基于ForkJoinPool的方式构建出来的。
ThreadPoolExecutor的核心特点
只有一个阻塞队列DelayedWorkQueue用来存放当前任务。下图中显而易见四个任务在此队列中阻塞等待,有一个任务来了那就被其中一个线程拿取消费。
ForkJoinPool的核心特点
分叉连接池。当有一个特别大的任务,ForkJoinPool区别于上述四大线程池将大任务交给某一个线程去执行的方式。ForkJoinPool线程池工作的特点就是将这个大任务拆分为多个小任务,放到当前线程的阻塞队列中。其他线程就可以去处理有不同阻塞队列中的线程任务。
代码效果使用演示
- 单线程的效果演示
- 多线程的效果演示
拆分任务的时候不是越多越好。任务体量要大,耗时要长!