Java中的线程池如何实现线程复用
Java线程池实现线程复用
闲来没事突然想到这个问题,便百度了下想查看具体实现,无果。
便自己翻看了下源码
以下是分析过程
众所周知,Java内部自带了个线程池实现 ExecutorService (虽然一直被人看不起)。
随便找到其中的一个静态方法
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}可知 ExecutorService 也只是一个封装,真正的实现还得看 ThreadPoolExecutor。
根据推断我们可以首先从 `ThreadPoolExecutor#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);
}读题解
传入的 Runnable 实例最终经过一系列安全检验被传入 addWorker 方法中
继续追踪可以看到实例(firstTask) 被传入 `ThreadPoolLocal#Worker#init` 的有参构造器中
而该 Worker 实例被添加进名为 workers 的哈希表中

终于是找到正主了!
让我们看看这个 Worker 到底是何方神圣,究竟是如何实现线程复用!
private final class Worker extends AbstractQueuedSynchronizer implements Runnable {
public void run() {
runWorker(this);
}
}好家伙,原来 Worker 也实现了 Runnable,查看 runWorker 方法可知,当当前任务执行后task置空,Worker 线程调用 getTask 方法从任务队列中获取新任务并执行。
至此便实现了一个 Worker 线程执行多个 Runnable 任务的功能。

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
MybatisPlus中removeById删除数据库未变解决方案
MyBatisPlus中,removeById需实体类标注@TableId注解以识别数据库主键,若字段名不一致,应通过value属性指定表主键字段名,确保正确映射2025-08-08
深入理解springMVC中的Model和Session属性
这篇文章主要介绍了深入理解springMVC中的Model和Session属性,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12
在Action中以Struts2的方式输出JSON数据的实例
下面小编就为大家带来一篇在Action中以Struts2的方式输出JSON数据的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2016-11-11
Java多态在Spring Boot 3中的实际应用实例教程
本文详细介绍了多态在SpringBoot中的应用,通过实际应用场景和设计模式的深度解析,展示了多态在构建松耦合、高内聚软件架构中的重要性,并提供了性能优化和最佳实践建议,感兴趣的朋友跟随小编一起看看吧2026-02-02
jdk8 FunctionalInterface注解源码解读
这篇文章主要介绍了jdk8 FunctionalInterface注解源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-11-11


最新评论