1.先看一波线程池的构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
参数解释
corePoolSize 核心线程数
maximumPoolSize 最大线程数
keepAliveTime 可回收线程(最大线程数-核心线程数)的存活时间
TimeUnit 存活时间单位
BlockingQueue 阻塞队列
ThreadFactory 线程工厂
RejectedExecutionHandler 拒绝策略
BlockingQueue 如果任务数超出线程池处理能力时加入队列
常用的实现类有
ArrayBlockingQueue 数组结构
LinkedBlockingDeque 双向链表结构
SynchronousQueue 单元素队列,内部实现是TransferQueue,如下图Node节点,头尾都是h,
TransferQueue() {
QNode h = new QNode(null, false); // initialize to dummy node.
head = h;
tail = h;
}
RejectedExecutionHandler 有四种
CallerRunsPolicy 任务来时不用线程池线程执行,而是主线程
AbortPolicy 丢弃任务且抛异常
DiscardPolicy 丢弃任务不抛异常
DiscardOldestPolicy 丢弃队列最前面的任务,然后重新尝试执行任务
看一波实现
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
5,
20,
100,
TimeUnit.SECONDS,
//设置demo
new ArrayBlockingQueue<>(10),
//采用默认线程工厂
Executors.defaultThreadFactory(),
//设置拒绝策略
new ThreadPoolExecutor.DiscardPolicy()
);
未完待续。。。。。。