写点什么

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:由调用线程(提交任务的线程)处理该任务。

发布于: 刚刚阅读数: 2
用户头像

风翱

关注

还未添加个人签名 2017.11.24 加入

勇于尝试,持续成长

评论

发布
暂无评论
ThreadPoolExecutor学习笔记