开发者社区> 问答> 正文

[@炯轩][¥20]线程池的execute方法是线程安全的吗?

线程池(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);

}

展开
收起
月下丶 2018-12-14 21:54:14 3608 0
1 条回答
写回答
取消 提交回答
  • 前一个帐号wangccsy@126.com不知道怎么的就成了企业帐号,改不成个人。所以重新注册了一个个人帐号。老程序员。精通JAVA,C#,数据库,对软件开发过程和流程熟悉。考取系统分析师,项目管理师和系统架构设计师等软件资格考试认证。愿意和大家一起前进。
    工作线程数小于核心线程数时,直接新建核心线程执行任务;
    大于核心线程数时,将任务添加进等待队列;
    队列满时,创建非核心线程执行任务;
    工作线程数大于最大线程数时,拒绝任务
    
    2019-07-17 23:21:37
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载