2026/4/7 9:47:07
网站建设
项目流程
哪个网站做海报好,营销型企业网站群策略,泰安网站推广,网站建设的培训班很多 Android / Java 开发者#xff0c;在学习并发时都会经历一个阶段#xff1a;
“代码能写#xff0c;但概念越学越乱。”Thread、Runnable、Callable、Future、Worker、线程池……
看起来都和“线程”有关#xff0c;但又好像都不一样。这篇文章的目标只有一个#xf…很多 Android / Java 开发者在学习并发时都会经历一个阶段“代码能写但概念越学越乱。”Thread、Runnable、Callable、Future、Worker、线程池……看起来都和“线程”有关但又好像都不一样。这篇文章的目标只有一个用一页认知彻底终结 Java 并发概念混乱。一、先给结论只记住这三句话如果你只想记住最核心的东西请记住这三句① Thread 才是真正的线程② Runnable / Callable 都只是“任务”③ 线程池 一堆 ThreadWorker反复执行一堆 Runnable后面所有内容都是这三句话的展开。二、谁才是“真正的线程”✅ ThreadThread才是真正被 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 的特点有返回值可以抛出异常CallableInteger c () - 123;但重点是Callable 也不是线程甚至不能直接交给 Thread五、Callable 是怎么跑起来的关键角色FutureTaskCallableInteger c () - 123; FutureTaskInteger task new FutureTask(c); new Thread(task).start(); System.out.println(task.get());这里发生了什么FutureTask实现了Runnable同时实现了FutureThread 只认识RunnableCallable必须先被包装成 FutureTaskFutureTask Runnable 结果容器六、Thread 和 Runnable / Callable 的真正关系一句话总结Thread 决定“谁来跑”Runnable / Callable 决定“跑什么”角色是线程吗作用Thread✅执行单元Runnable❌无返回值任务Callable❌有返回值任务FutureTask❌任务 结果七、线程池里到底发生了什么这是理解并发的关键一步。线程池的本质结构线程池 ├── WorkerThread × 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 → FutureTasksubmit(Callable)FutureCallable → FutureTasksubmit 内部一定会创建 FutureTask十、三个最常见误区一次性清空❌ 误区 1实现 Runnable 就是线程✔ 真相Runnable 只是任务❌ 误区 2run() 会开启新线程✔ 真相只有 start()❌ 误区 3Thread 实现 Callable✔ 真相Thread 实现的是 Runnable十一、一句压箱底总结建议背下来Thread 是线程Runnable / Callable 是任务Worker 是线程池里的 ThreadCallable 要靠 FutureTask 才能跑submit 一定会返回 Future写在最后很多并发问题并不是 API 不会用而是“线程”和“任务”的边界没想清楚。当你真正理解了线程是有限资源任务是无限的线程必须被池化、被管理你就已经迈入了后端 / 系统级并发思维。