线程池:ThreadPoolExecutor
不做过多介绍了,java源码中有详细英文介绍
构造函数:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
七大参数基本介绍:
* corePoolSize:核心线程数[一直存在,除非allowCoreThreadTimeOut],创建好了就一直存在,等待接受任务去执行
* maximumPoolSize:最大线程数量;控制资源
* keepAliveTime:存活时间,如果当前正在运行的线程数量大于核心数量。
* 可以释放空闲线程(maximumPoolSize-corePoolSize)(线程空闲时间大于指定的keepAliveTime)
* unit:时间单位
* workQueue:阻塞队列,如果任务有很多,就将目前多的任务放在队列中
* 只要有线程空闲,就会去队列中取出新的任务去执行
* threadFactory:线程的创建工厂
* handler:如果当前阻塞队列满了,就会执行该策略拒绝任务
线程池工作顺序:
* 1)线程池创建,准备好核心线程,准备接收任务
* 1.1 core满了,就将进来的任务放在阻塞队列中,空闲的core就会自己去阻塞队列中获取执行
* 1.2 阻塞队列满了,就直接开启新线程执行,最大只能开启到maximumPoolSize的线程数目
* 1.3 maximumPoolSize满了,就采用handler去拒绝任务
* 1.4 maximumPoolSize都执行完成,就会有很多的线程空闲,在指定的时间keepAliveTime以后,释放maximumPoolSize-corePoolSize这些线程
常见四种线程池:
* newCachedThreadPool:创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收线程,若无可回收,则新建线程
* newFixedThreadPool:创建一个定长线程池,可控制最大并发数
* newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行
* newSingleThreadExecutor:创建一个单线程化的线程池,只有唯一一个线程来执行任务
基本使用:
一般来说ExecutorService的创建,不会写在业务方法中。
public static ExecutorService service = Executors.newFixedThreadPool(10);
service.execute(() -> {});