news 2026/4/16 10:49:36

一次性讲清:Thread / Runnable / Callable / Worker / 线程池(Java 并发不再混乱)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一次性讲清:Thread / Runnable / Callable / Worker / 线程池(Java 并发不再混乱)

很多 Android / Java 开发者,在学习并发时都会经历一个阶段:
“代码能写,但概念越学越乱。”

Thread、Runnable、Callable、Future、Worker、线程池……
看起来都和“线程”有关,但又好像都不一样。

这篇文章的目标只有一个:

用一页认知,彻底终结 Java 并发概念混乱。

一、先给结论:只记住这三句话

如果你只想记住最核心的东西,请记住这三句:

① Thread 才是真正的线程
② Runnable / Callable 都只是“任务”
③ 线程池 = 一堆 Thread(Worker)反复执行一堆 Runnable

后面所有内容,都是这三句话的展开。

二、谁才是“真正的线程”?

✅ Thread

  • Thread才是真正被 JVM / CPU 调度的执行单元
  • start()才会创建新线程
  • run()只是线程启动后的入口方法
new Thread(() -> { System.out.println("run in new thread"); }).start();

判断标准很简单:

能不能被 CPU 调度?
能 → Thread
不能 → 不是线程

三、Runnable 到底是什么?(非常容易被误解)

Runnable ≠ 线程

class MyTask implements Runnable { @Override public void run() { System.out.println("task run"); } }

Runnable的本质是:

  • 一个任务
  • 一段可被线程执行的代码
  • 自己不会创建线程
  • 自己不会并发执行

⚠️ 注意下面这个常见误区:

Runnable r = () -> System.out.println("run"); r.run(); // 不是多线程!

这只是一个普通方法调用

四、Callable 又是什么?和 Runnable 有什么区别?

Callable 的特点

  • 有返回值
  • 可以抛出异常

Callable<Integer> c = () -> 123;

但重点是:

Callable 也不是线程,甚至不能直接交给 Thread

五、Callable 是怎么跑起来的?

关键角色:FutureTask

Callable<Integer> c = () -> 123; FutureTask<Integer> task = new FutureTask<>(c); new Thread(task).start(); System.out.println(task.get());

这里发生了什么?

  • FutureTask

实现了Runnable
同时实现了Future

  • Thread 只认识Runnable
  • Callable必须先被包装成 FutureTask

FutureTask = Runnable + 结果容器

六、Thread 和 Runnable / Callable 的真正关系

一句话总结:

Thread 决定“谁来跑”
Runnable / Callable 决定“跑什么”

角色是线程吗作用
Thread执行单元
Runnable无返回值任务
Callable有返回值任务
FutureTask任务 + 结果

七、线程池里到底发生了什么?

这是理解并发的关键一步

线程池的本质结构

线程池 ├── Worker(Thread) × N └── Runnable / FutureTask(任务)

Worker 是什么?

class Worker extends Thread { @Override public void run() { while (true) { Runnable task = takeTask(); task.run(); } } }
  • Worker 是线程
  • Worker 是常驻的
  • 一个 Worker 会执行很多个 Runnable

八、为什么 Worker.run 里又调用 Runnable.run?

因为:

  • Thread 的run():线程生命周期
  • Runnable 的run():业务逻辑
线程(Worker) └── run() ← 线程入口(只进一次) └── while(true) └── task.run() ← 业务任务(进很多次)

线程和任务被彻底解耦,这就是线程池存在的意义。

九、execute / submit 的本质区别

方法返回值本质
execute(Runnable)丢任务
submit(Runnable)FutureRunnable → FutureTask
submit(Callable)FutureCallable → FutureTask

submit 内部一定会创建 FutureTask

十、三个最常见误区(一次性清空)

❌ 误区 1:实现 Runnable 就是线程

✔ 真相:Runnable 只是任务

❌ 误区 2:run() 会开启新线程

✔ 真相:只有 start()

❌ 误区 3:Thread 实现 Callable

✔ 真相:Thread 实现的是 Runnable

十一、一句压箱底总结(建议背下来)

Thread 是线程
Runnable / Callable 是任务
Worker 是线程池里的 Thread
Callable 要靠 FutureTask 才能跑
submit 一定会返回 Future

写在最后

很多并发问题,并不是 API 不会用,
而是“线程”和“任务”的边界没想清楚

当你真正理解了:

  • 线程是有限资源
  • 任务是无限的
  • 线程必须被池化、被管理

你就已经迈入了后端 / 系统级并发思维

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 8:43:47

微信小程序uniapp-vue理发店美容预约

文章目录具体实现截图主要技术与实现手段系统设计与实现的思路系统设计方法java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;带文档1万…

作者头像 李华
网站建设 2026/4/15 13:47:32

微信小程序uniapp-vue驾校教培-预约科目考试系统

文章目录 具体实现截图主要技术与实现手段系统设计与实现的思路系统设计方法java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;带文档1…

作者头像 李华
网站建设 2026/4/16 10:17:28

zTasker v2.3.4:Windows 自动化任务工具

zTasker v2.3.4 是一款专为Windows系统设计的免费自动化任务工具&#xff0c;支持从Win7到Win11等多个版本。这款工具体积轻巧&#xff0c;仅8MB左右&#xff0c;却能够通过热键、定时或系统条件触发上百种任务&#xff0c;帮助用户有效提升操作效率。无论是个人日常使用还是企…

作者头像 李华
网站建设 2026/4/16 10:16:02

昇思MindSpore打造HyperParallel架构,引领AI框架迈入“超节点时代”

[中国&#xff0c;杭州&#xff0c;2025年12月25日] 今日&#xff0c;昇思人工智能框架峰会在杭州国际博览中心召开&#xff0c;本次大会以“昇思MindSpore为超节点而生的AI框架 ”为主题&#xff0c;由昇思MindSpore开源社区、全球计算联盟GCC主办&#xff0c;华为技术有限公司…

作者头像 李华
网站建设 2026/4/16 10:18:34

哪些字段适合加索引,哪些不适合加?

索引是数据库中用于加快数据查询的重要结构&#xff0c;类似于书的目录&#xff0c;可以让数据库迅速定位到所需的数据&#xff0c;而不必每次都全表扫描。一、常见索引类型B树索引&#xff1a;大多数关系型数据库的默认索引类型&#xff0c;支持范围查询、模糊查询等。哈希索引…

作者头像 李华
网站建设 2026/4/16 10:20:45

政企用户搭建办公系统,哪个厂商的信创云桌面产品做得比较好?

随着数字化转型的深入&#xff0c;政企用户对办公系统的需求日益提升&#xff0c;不仅要求高效便捷&#xff0c;更注重安全可控。在这一背景下&#xff0c;信创云桌面作为基于国产化技术的虚拟化解决方案&#xff0c;逐渐成为搭建办公系统的重要选择。然而&#xff0c;面对市场…

作者头像 李华