线程池初始化与定义
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
线程池构造方法的入参含义分别如下:
- corePoolSize:核心线程数,必须大于或等于 0
- maximumPoolSize:最大线程数,必须大于 0 且大于或等于核心线程数
- keepAliveTime:空闲线程存活时间,必须大于或等于 0
- unit:存活时间单位 TimeUnit
- workQueue:阻塞队列,存储通过 execute() 方法提交的未能开始执行的任务。常见的选择有:
- ArrayBlockingQueue:基于数组结构的有界阻塞队列,FIFO
- PriorityBlockingQueue:具有优先级的无界阻塞队列,较少使用
- LinkedBlockingQueue:基于链表结构的无界阻塞队列,吞吐量通常要高于 ArrayBlockingQueue,FIFO
- SynchronousQueue:不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于 LinkedBlockingQueue
- threadFactory:线程创建工厂,一般可以用默认的
- handler:饱和/拒绝策略,有以下四种策略:
ThreadPoolExecutor.AbortPolicy:(默认)阻塞队列已满,丢弃任务并抛出 RejectedExecutionException 异常。ThreadPoolExecutor.DiscardPolicy:阻塞队列已满,丢弃任务,但是不抛出异常。ThreadPoolExecutor.DiscardOldestPolicy:阻塞队列已满,丢弃队列最前面的任务,然后重新尝试加入队列执行任务(重复此过程)。ThreadPoolExecutor.CallerRunsPolicy:由发起调用的线程自己去执行该任务(如果主线程运行结束,则丢弃该任务);会降低新任务的提交速度,影响程序的整体性能。- 也可以根据实际需求自定义拒绝策略,实现
RejectedExecutionHandler接口
当 ThreadPoolExecutor 线程池被创建的时候,里面是没有创建工作线程的,直至有任务调用了 execute() 方法时,才开始创建工作线程。除非调用 prestartAllCoreThreads() 或者 prestartCoreThread() 方法,可以手动预创建线程。调用 execute() 方法时的具体工作原理为:
- 如果当前工作线程数小于核心线程数,则创建新的线程执行任务,否则将任务加入阻塞队列;
- 如果阻塞队列满了,则根据最大线程数创建额外(非核心工作线程)的工作线程去执行任务;
- 如果工作线程数达到了线程池允许的最大线程数,则根据拒绝策略去执行。
- 非核心线程的存活时间到期的话,线程资源将会被回收。

最低0.47元/天 解锁文章
874

被折叠的 条评论
为什么被折叠?



