当前位置: 首页 > news >正文

使用Thead子类创建线程VS使用Thead直接创建线程(Runnable)的区别

一、核心原理
继承 Thread 类:Thread 类本身实现了 Runnable 接口,子类通过重写run()方法定义线程执行逻辑,调用子类对象的start()方法启动线程。
实现 Runnable 接口:将线程执行逻辑封装在 Runnable 接口的run()方法中,再将该 Runnable 实例作为参数传递给 Thread 类的构造函数,通过 Thread 对象的start()方法启动线程。
二、核心区别对比

三、代码示例

  1. 继承 Thread 类
    class MyThread extends Thread {
    private int ticket = 5;

    @Override
    public void run() {
    while (ticket > 0) {
    System.out.println(Thread.currentThread().getName() + " 卖票:" + ticket–);
    }
    }
    }

public class ThreadDemo {
public static void main(String[] args) {
// 三个线程各卖5张票,资源不共享
new MyThread().start();
new MyThread().start();
new MyThread().start();
}
}
输出:总共卖出 15 张票,每个线程独立维护自己的 ticket 变量。
2. 实现 Runnable 接口
class MyRunnable implements Runnable {
private int ticket = 5;

@Override public void run() { while (ticket > 0) { // 注意:实际生产中需加同步锁保证线程安全 System.out.println(Thread.currentThread().getName() + " 卖票:" + ticket--); } }

}

public class RunnableDemo {
public static void main(String[] args) {
MyRunnable task = new MyRunnable();
// 三个线程共享同一个task实例的ticket变量
new Thread(task, “窗口1”).start();
new Thread(task, “窗口2”).start();
new Thread(task, “窗口3”).start();
}
}
输出:总共卖出 5 张票,三个线程共同操作同一个 ticket 变量(需加同步锁避免超卖)。
四、开发建议
优先使用实现 Runnable 接口的方式:它是 Java 多线程开发的标准实践,解决了单继承问题,支持资源共享和线程池,代码可维护性和扩展性更好。
仅在需要重写 Thread 类其他方法(如start()、interrupt())时,才考虑继承 Thread 类。
如果需要线程执行后返回结果或抛出受检异常,推荐使用Callable接口结合FutureTask,它是 Runnable 的增强版。

http://www.cnnetsun.cn/news/2861286.html

相关文章:

  • 从零接触到悟出Claude Code类Harness模式
  • 基金投资终极实战指南:从建仓到止亏的完整闭环
  • 制造业系统集成困局:乐高说明书(ESB)、万能插排(iPaaS)与聪明“手”(RPA)
  • 2026年Codex最全实操指南:如何用14个步骤掌握
  • 联想 ITIL 5 内训课程,不是一次“新版知识补课“
  • 【多模态大模型面经】Transformer专题面经
  • 【毕业设计】基于springboot+微信小程序的文化展示、旅游攻略、智能推荐文化旅游小程序系统(源码+文档+远程调试,全bao定制等)
  • 从高德 5 万年费,到拼 Key 翻车:一个中小团队的地图服务降本实录
  • 064、NPU的ResNet加速:残差块的硬件映射
  • 打工人必备记录神器:工作备忘、待办提醒一步到位
  • 极简日常记录工具:生活备忘、各类提醒全部安排妥当
  • Codex 提示 model not supported / model not found
  • 他一开口,我就知道他很懂AI Agent
  • 草地牛火了之后,它后来发生了什么?
  • C语言学习Day17
  • 深入解析LPC55S3x:从Flexcomm到EdgeLock,如何高效利用外设与安全子系统
  • 手把手教你解决MathWorks账户‘Technical Issue’报错(附地区切换避坑指南)
  • Databricks社区版升级付费版:AWS云环境部署与生产就绪指南
  • 从本地Win10到云端CentOS:我的第一个Spring Boot博客部署全记录(附WinSCP+域名绑定心得)
  • 用C++解决‘合影效果’排序题:从STL sort到冒泡排序的三种实战写法(附避坑点)
  • 从数独到拼图:我的日历拼图解题策略与启发式搜索心得
  • MATLAB实战:用锤击法测水泥试件的固有频率与阻尼比(附完整代码与数据)
  • C++结构体排序实战:从信息学奥赛题到学生成绩管理系统(附完整代码)
  • 从JFET到MOSFET:手把手教你选对场效应管做小信号放大(附实际电路搭接与测试指南)
  • 效率翻倍!如何用嘉立创BOM模板反推设计你的Cadence SPB17.4 CIS数据库字段?
  • 用老古董uA741搭个PWM发生器:从Multisim仿真到面包板实测的完整避坑指南
  • 别再手动算脉冲了!用STM32的编码器接口模式,5分钟搞定电机测速
  • 生物医学大数据隐私保障的三层实战平衡框架
  • 手把手教你用LabVIEW和USRP搭建无线文本传输系统(附完整VI程序框图)
  • BLE开发避坑:MTU交换不是你想的那样,聊聊ATT层那点事(附空中包分析)