一、如何合理配置线程池
CPU密集型:
System.out.println(Runtime.getRuntime().availableProcessors());查看CPU核数
CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行。
CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程)
而在单核CPU上,无论你开几个模拟的多线程该任务都不可能得到加速,因为CPU总的运算能力就那些。
CPU密集型任务配置尽可能少的线程数量,一般公式:CPU核数+1个线程
线程池ThreadPoolExecutor实现原理:
IO密集型:
1、由于IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程,如CPU核数*2;
2、IO密集型,即该任务需要大量的IO,即大量的阻塞。
在单线程上运行IO密集型的任务会导致浪费大量的CPU运算能力浪费在等待。
所以在IO密集型任务中使用多线程可以大大滴加速程序运行,即使在单核CPU上,这种加速主要就是利用了被浪费掉的阻塞时间。
IO密集型时,大部分线程都阻塞,故需要多配置线程数:
参考公式:CPU核数/(1-阻塞系数) 阻塞系数在0.8~0.9之间
比如8核CPU: 8/(1-0.9)=80个线程数
带着几个问题进入源码分析:
1. 线程池是什么时候创建线程的?
2. 任务runnable task是先放到core到maxThread之间的线程,还是先放到队列?
3. 队列中的任务是什么时候取出来的?
4. 什么时候会触发reject策略?
5. core到maxThread之间的线程什么时候会die?
6. 线程池中的核心线程为什么不会释放而是循环等待任务?
7. task抛出异常,线程池中这个work thread还能运行其他任务吗?
一、先写一段基础代码,进入分析
package com.ctgu.chenjun;
import java.util.concurrent.ArrayBlockingQueue;
import java.ut