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

Thread 类和 Runnable 接口的区别

Thread类
通过继承Thread类创建线程需要重写run方法,每个线程对象拥有独立的资源副本。适合需要独立资源的场景,但受限于Java单继承机制。

Runnable接口
实现Runnable接口的类需定义run方法,并将实例作为参数传递给Thread对象。多个线程可共享同一个Runnable实例的资源,适合资源共享场景。


买火车票案例

Runnable实现类

public class BuyTicketThread implements Runnable { int ticketNum = 10; // 共享资源 @Override public void run() { for (int i = 1; i <= 100; i++) { if (ticketNum > 0) { System.out.println("我在" + Thread.currentThread().getName() + "买到了北京到哈尔滨的第" + ticketNum-- + "张车票"); } } } }
  • ticketNum为实例变量,被多个线程共享。
  • 通过Thread.currentThread().getName()获取当前线程名称。

线程启动

public class Test { public static void main(String[] args) { BuyTicketThread t = new BuyTicketThread(); // 共享同一个Runnable实例 new Thread(t, "窗口1").start(); new Thread(t, "窗口2").start(); new Thread(t, "窗口3").start(); } }
  • 三个线程共享同一个BuyTicketThread实例,操作同一份ticketNum

开发中为何优先选择Runnable

单继承限制
Java不支持多继承,若类已继承其他类,则无法再继承Thread类。

资源共享优势

  • 无需使用static修饰共享变量,直接通过实例成员实现共享。
  • 更符合面向对象设计,任务与线程执行逻辑解耦。

扩展性
Runnable接口可与线程池、Lambda表达式等现代Java特性更好结合。


补充说明

若使用Thread类实现相同功能,需将ticketNum声明为static才能共享:

public class BuyTicketThread extends Thread { static int ticketNum = 10; // 必须静态 @Override public void run() { /* 同前 */ } }

此方式耦合度高且灵活性差,实际开发中较少采用。

Thread类买火车票代码:

​ public class BuyTicketThread extends Thread { public BuyTicketThread(String name){ super(name); } //一共10张票: static int ticketNum = 10;//多个对象共享10张票 //每个窗口都是一个线程对象:每个对象执行的代码放入run方法中 @Override public void run() { //每个窗口后面有100个人在抢票: for (int i = 1; i <= 100 ; i++) { if(ticketNum > 0){//对票数进行判断,票数大于零我们才抢票 System.out.println("我在"+this.getName()+"买到了从北京到哈尔滨的第" + ticketNum-- + "张车票"); } } } } public class Test { public static void main(String[] args) { //多个窗口抢票:三个窗口三个线程对象: BuyTicketThread t1 = new BuyTicketThread("窗口1"); t1.start(); BuyTicketThread t2 = new BuyTicketThread("窗口2"); t2.start(); BuyTicketThread t3 = new BuyTicketThread("窗口3"); t3.start(); } } ​
http://www.jsqmd.com/news/624266/

相关文章:

  • dplyr和tidyr用法释
  • “INMS: Memory Sharing for Large Language Model based Agents“ 论文笔记貉
  • 2026年4月餐饮配料供应商推荐分析,火锅底料/复合调味料/预制菜调味料/酒店调料/鸡精,餐饮配料厂商口碑推荐 - 品牌推荐师
  • Vue 3 Markdown编辑器性能优化指南:让你的编辑器流畅如飞
  • 聊聊2026年河南种子会,郑州万泽展览展示公司的优势在哪 - mypinpai
  • Electron 27 静默打印实战:从样式错乱到完美适配的完整避坑指南
  • MPC-BE多媒体播放器架构设计与性能优化深度解析
  • 多租户下的ERP系统的仓储管理模块分析设计吃
  • 如何快速将网页转为Markdown:免费浏览器扩展的终极指南
  • Bidili Generator多场景落地:电商海报、IP形象、社交头像生成实战
  • 随机森林实战:Python与sklearn构建金融预测模型
  • 告别繁琐!WinRAR在Win11上实现‘解压到当前文件夹’的两种终极设置方案
  • 如何快速掌握鼠标连点器:3分钟完成自动化点击配置
  • 一文搞懂 OpenAI 接口(含 DeepSeek 兼容 流式输出实战)
  • 7步掌握PyTorch情感分析:从IMDb到自定义数据的完整指南
  • 操作符
  • 如何快速解锁Cursor Pro功能:终极免费VIP指南
  • 26年春季学期学习记录第21天
  • HOOPS Visualize Web 2026.1.0:三大核心升级,开启Web 3D可视化开发新范式
  • 从零搞懂Transformer,从位置编码到自注意力,大模型的核心逻辑全拆解
  • ESP32-S3蓝牙开发避坑指南:为什么你的SPP协议跑不起来?
  • 从零入门性能测试:理论+JMETER实操,看完就能上手厩
  • 【千亿参数大模型落地实战白皮书】:SITS2026独家解密——从GPU集群调度到推理延迟压降至87ms的5大关键跃迁
  • FortiGate 防火墙 DNS 地址转换实战:从配置到验证的全流程解析
  • 终极指南:如何使用Apache OpenDAL构建企业级数据湖统一访问平台
  • 合肥响应式网站建设公司|技术标准、用户痛点、行业趋势与售后服务深度解析 - 企业推荐官【官方】
  • FourWireFan库:嵌入式四线风扇高精度闭环控制方案
  • 3月干货!服务好的防爆板供应商推荐,防爆板/纤维水泥复合钢板/泄爆墙/抗爆板/泄爆板/防爆墙,防爆板生产厂家有哪些 - 品牌推荐师
  • Flask、Django与FastAPI
  • Kandinsky-5.0-I2V-Lite-5s快速体验:PyCharm集成开发环境一键调试