ThreadPoolExecutor
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
参数详解
corePoolSize 核心线程数当线程数<corePoolSize时,新建线程。
maxinumPoolSize 最大线程数
keepAliveTime 存活时间当线程数>corePoolSize时,空闲线程存活的最长时间
timeUnit 单位时间
workQueue 保存任务的阻塞队列
threadFactory 线程创建工厂
handler 拒绝策略
任务执行顺序
- 当线程数<corePoolSize时,新建线程执行任务。
- 当线程数>corePoolSize,且workQueue未满的时候,任务加到workQueue中。
- 当线程数>corePoolSize,且workQueue满了,且当前线程数<maximumPoolSize,则新起线程执行。
- 当线程数>corePoolSize,且workQueue满了,且当前线程数>=maximumPoolSize,则执行拒绝策略
4个默认拒绝策略
拒绝策略默认有4种1.抛出异常2.直接丢弃3.丢弃队列中最老的4.直接调用run方法,阻塞执行。当然也可以继承RejectedExecutionHandler实现自己的拒绝策略
Executors
因为参数比较多,java中的Exectors提供了简便的线程池创建方式。
1.Executors#newFixedThreadPool(int nThreads) 固定线程池
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
可以看到用的workQueue是LinkedBlockingQueue,说明队列无限长,线程池最大值就是入参nThreads。
2.Executors#newCachedThreadPool() 线程池为Integer.MAX_VALUE的线程池
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
SynchronousQueue是容量为1的阻塞队列,所以新增任务的时候会新起线程,线程数最大值为Integer.MAX_VALUE
3.Executors#newSingleThreadPool() 线程数为1的线程池
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
不用说了,线程数最大为1。
TaskFuture
继承于Future,能够实现带返回值的线程执行结果。几个特殊方法,isDone()get(),get(Long timeOut,TimeUtil)cancel(),isCancel()