Executors 创建线程池的几种方式:
Executor.newFixedThreadPool: 创建固定线程数的线程池(完全没有临时工的版本)
Executor.newCachedThreadPool: 创建线程数目可变的线程池.(完全没有正式员工,全是临时工)
Executor.newSingleThreadExecutor: 创建只包含单个线程的线程池. (只在特定场景下使用)
Executor.newScheduledThreadPool: 能够设定延时时间的线程池(插入的任务能够过一会再执行),相当于进阶版的定时器。
Java的线程池参数
构造函数
public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
corePoolSize: 表示核心线程数。当有新任务需要执行时,如果当前运行的线程数小于此值,则创建线程用于执行该任务;当有新任务需要执行且此时正在运行的线程数大于等于此值时,直接把新任务放入阻塞任务队列中。
maximumPoolSize: 线程池的最大线程数。当有新任务需要执行,且核心线程全部被使用,且阻塞任务对接也满时,线程池会创建线程用于执行阻塞队列中的任务,然后将任务加入队列末端;如果新任务进来,核心线程已满,阻塞任务队列已满,最大线程数已满,此时该新任务会被拒绝,并执行对应的拒绝策略RejectedExecutionHandler。
keepAliveTime: 闲置超时时间。当线程池中的线程数大于corePoolSize时,此值才生效,即大于corePoolSize的线程在经过keepAliveTime的时间依然没有任务执行,则销毁线程。
unit: 超时时间单位。参数keepAliveTime的单位。
workQueue: 工作队列(任务阻塞队列)。当核心线程数已满时,且队列没有满时,新提交的任务放到任务队列中; 当新任务进来且任务队列已满,且当前正在运行的线程数小于最大线程数maximumPoolSize时,则创建新的线程用于运行任务; 当新任务进来,核心线程已满,任务队列已满,最大线程数已满,则执行拒绝策略。
threadFactory: 线程池创建新线程的工厂。创建线程,一般默认即可。
handler: 线程池达到饱和之后的拒绝策略。当线程数达到最大线程maximumPoolSize后(此时队列已经存满),再有新任务提交,执行的处理策略。