ThreadPoolExecutor 学习笔记
ThreadPoolExecutor
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
else if (!addWorker(command, false))
reject(command);
}
ThreadPoolExecutor 提交任务逻辑:
1. 判断 corePoolSize 【创建】
2. 加入 workQueue
3. 判断 maximumPoolSize 【创建】
4. 执行拒绝策略处理器
缓冲队列
BlockingQueue 是双缓冲队列。BlockingQueue 允许两个线程同时向队列一个存储,一个取出
操作。在保证并发安全的同时,提高了队列的存取效率。
1. ArrayBlockingQueue:规定大小的 BlockingQueue,其构造必须指定大小。其所含的对象
是 FIFO 顺序排序的。
2. LinkedBlockingQueue:大小不固定的 BlockingQueue,若其构造时指定大小,生成的
BlockingQueue 有大小限制,不指定大小,其大小有 Integer.MAX_VALUE 来决定。其所含
的对象是 FIFO 顺序排序的。
3. PriorityBlockingQueue:类似于 LinkedBlockingQueue,但是其所含对象的排序不是 FIFO,
而是依据对象的自然顺序或者构造函数的 Comparator 决定。
4. SynchronizedQueue:特殊的 BlockingQueue,对其的操作必须是放和取交替完成。
拒绝策略
1. ThreadPoolExecutor.AbortPolicy: 丢弃任务并抛出 RejectedExecutionException 异常。
2. ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。
3. ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
4. ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务。
版权声明: 本文为 InfoQ 作者【风翱】的原创文章。
原文链接:【http://xie.infoq.cn/article/0f038c12af1ae292c12be39ee】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论