0

0

在Java里Runnable与Thread有什么区别_Java线程实现方式对比说明

P粉602998670

P粉602998670

发布时间:2026-01-22 14:28:02

|

436人浏览过

|

来源于php中文网

原创

Runnable 描述“要做什么”,Thread 负责“用什么去执行”;Runnable 无 start() 方法,仅 Thread 可启动线程并回调其 run();推荐优先使用 Runnable 以避免单继承限制、支持复用与线程池。

在java里runnable与thread有什么区别_java线程实现方式对比说明

Runnable 是任务,Thread 是线程载体

直接说结论:Runnable 描述「要做什么」,Thread 负责「用什么去执行」。你不能调用 runnable.start() —— 它压根没这个方法;只有 Thread 实例才有 start(),而且它内部最终会调用传入的 Runnable.run()(哪怕你继承 Threadrun() 也是被 start0() 这个 native 方法间接触发的)。

常见错误现象:
- 把 myRunnable.run() 当成启动线程 —— 实际只是普通方法调用,仍在主线程执行,完全没并发;
- 继承 Thread 后又试图 new 多个实例共享状态(比如票数),结果每个 Thread 子类对象都有一份独立的 total 字段,根本不是“共享资源”,只是看起来像。

为什么推荐优先用 Runnable?不是因为 Thread 不能共享,而是它天然不适合

关键不在“能不能”,而在“要不要为一个线程功能,把唯一的继承权搭进去”。Java 只允许单继承,如果你的业务类已经继承了 ServiceFragment 或某个框架基类,再想加多线程能力,Runnable 就是唯一干净的选择。

实操建议:
- ✅ 用 Runnable:任务逻辑需要复用(如多个线程跑同一段计算)、要进线程池(ExecutorService.submit(runnable))、类已继承其他父类;
- ⚠️ 慎用 Thread 子类:仅适用于极简 demo 或调试场景,比如临时起个线程打日志、发心跳;
- ❌ 避免混合:别写 class MyTask extends Thread implements Runnable —— 冗余且易混淆,Thread 本身已实现 Runnable

共享资源的真相:和 Runnable/Thread 无关,只和对象实例有关

网上常说“Runnable 可以共享资源,Thread 不行”,这是误导。真正决定能否共享的,是「多个线程是否操作同一个对象实例」:

public class TicketSeller implements Runnable {
    private int total = 10; // 实例变量
    public void run() {
        synchronized(this) { // 锁住当前实例
            if (total > 0) System.out.println("卖出:" + total--);
        }
    }
}
<p>// ✅ 共享:两个线程共用同一个 TicketSeller 实例
TicketSeller seller = new TicketSeller();
new Thread(seller, "窗口1").start();
new Thread(seller, "窗口2").start();</p><p>// ❌ 不共享:每个 Thread 子类都是新对象,total 各自一份
class MyThread extends Thread {
private int total = 10;
public void run() { /<em> ... </em>/ }
}
new MyThread().start(); // total=10
new MyThread().start(); // total=10(另一个副本)</p>

Thread 构造器里传 Runnable,到底发生了什么?

new Thread(runnable) 并不是“把 Runnable 塞进 Thread”,而是让 Threadrun() 方法内部委托给 runnable.run()。看源码就知道:Thread.run() 默认实现就是:

无限画
无限画

千库网旗下AI绘画创作平台

下载

立即学习Java免费学习笔记(深入)”;

public void run() {
    if (target != null) {
        target.run(); // target 就是你传进来的 Runnable
    }
}

所以你写 new Thread(() -> System.out.println("hi")).start(),本质上仍是靠 Thread 对象启动 OS 线程,再回调你的 lambda。这层解耦,正是 Runnable 的价值所在——任务逻辑可测试、可替换、可序列化(比如发到远程节点执行),而 Thread 只是 JVM 提供的一次性执行环境。

最容易被忽略的一点:Thread 类本身有大量状态字段(threadLocalsinheritableThreadLocalsthreadStatus 等),频繁 new Thread 会带来额外内存开销;而 Runnable 实例轻量得多,配合线程池才是生产环境的标准姿势。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

215

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

192

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

61

2026.01.05

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

891

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

32

2025.12.06

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

377

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

32

2026.01.21

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.3万人学习

Java 教程
Java 教程

共578课时 | 81.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号