JAVA线程池线程复用机制核心摘要

1、线程创建时机

1.1、submitTask

executor.submit(task);

java 复制代码
ExecutorService executor = Executors.newFixedThreadPool(3);

// 创建一个 Callable 任务
 Callable<Integer> task = new Callable<Integer>() {
    @Override
    public Integer call() throws Exception {
       System.out.println("Task is being processed by " + Thread.currentThread().getName());
       Thread.sleep(1000); // 模拟一些工作
       return 42; // 返回结果
            }
};

Future<Integer> future = executor.submit(task);

1.2、addWorker

java 复制代码
        int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }

1.3、创建线程&跟worker绑定

java 复制代码
        Worker(Runnable firstTask) {
            setState(-1); // inhibit interrupts until runWorker
            this.firstTask = firstTask;
            this.thread = getThreadFactory().newThread(this);
        }

this.thread = getThreadFactory().newThread(this);

这里是worker跟线程关联的核心,new Thread 的时候把woker作为runable传进去了,后面thread.start()的时候,会回调worker的run()方法,这样线程就跟worker绑定了。

java 复制代码
 if (workerAdded) {
                    t.start();
                    workerStarted = true;
                }

启动线程,回调worker 的 runWorker方法

1.4、线程复用核心

java 复制代码
final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        w.unlock(); // allow interrupts
        boolean completedAbruptly = true;
        try {
            while (task != null || (task = getTask()) != null) {
                w.lock();

while循环,有任务执行,无任务则block,等待任务,这样线程就能做复用了。

相关推荐
忆往wu前19 分钟前
从0到1一步步拆解搭建,梳理一个 Vue3 简易图书后台全开发流程
前端·javascript·vue.js
木斯佳26 分钟前
前端八股文面经大全:字节抖音前端三面(2026-04-27)·面经深度解析
前端·面试·笔试·八股·面经
Navicat中国40 分钟前
使用 Navicat 导入向导导入 Excel 数据时,系统提示导入成功,表中也能看到数据,但行数统计显示为 0,这是什么原因?
数据库·excel·导入
小怪吴吴43 分钟前
idea 开发Android
android·java·intellij-idea
嘻嘻哈哈樱桃1 小时前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划
gmaajt1 小时前
Golang怎么做国际化多语言_Golang i18n教程【核心】
jvm·数据库·python
一次旅行1 小时前
IDEA安装CC GUI新手指南
java·ide·intellij-idea
光影少年1 小时前
大屏页面,一次多个请求,请求加密导致 点击 全局时间选择器 时出现卡顿咋解决(面板收起会延迟1~2秒)
前端·javascript·vue.js·学习·前端框架·echarts·reactjs
超梦dasgg1 小时前
Spring AI 智能航空助手项目实战
java·人工智能·后端·spring·ai编程
折哥的程序人生 · 物流技术专研1 小时前
从“卡死”到“秒过”:WMS销售数据跨库回填的极限优化之旅
数据库·机器学习·oracle