线程池(ThreadPoolExecutor)的execute方法如下,该方法在执行了读取语句:
int c = ctl.get()
后,执行了比较:
if (workerCountOf(c) < corePoolSize)
这两句之间没有添加任何保护线程安全的方法,所以execute是如何实现线程安全的呢?
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);
}
工作线程数小于核心线程数时,直接新建核心线程执行任务;
大于核心线程数时,将任务添加进等待队列;
队列满时,创建非核心线程执行任务;
工作线程数大于最大线程数时,拒绝任务
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。