news 2026/4/24 0:30:30

Thread 类和 Runnable 接口的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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(); } } ​
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 4:20:14

eMMC(五)——总线数据流

目录 1. 总线接口 2. eMMC 总线模型 2.1 速率模式 2.2 通信模型 2.2.1 读数据 2.2.2 写数据 2.2.3 No Data 2.2.4 commad命令数据包 2.2.5 response响应数据包 2.2.6 emmc的五种类型的响应 2.2.6.1 R1 2.2.6.2 R2 2.2.6.3 R3 2.2.6.4 R4 2.2.6.5 R5 2.2…

作者头像 李华
网站建设 2026/4/17 22:29:30

一天一个Python库:lxml - 高效解析XML和HTML的利器信

一、什么是setuptools&#xff1f; setuptools 是一个用于创建、分发和安装 Python 包的核心库。 它可以帮助你&#xff1a; 定义 Python 包的元数据&#xff08;如名称、版本、作者等&#xff09;。 声明包的依赖项&#xff0c;确保你的包能够正确运行。 构建源代码分发包&…

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

圆覆盖【牛客tracker 每日一题】

圆覆盖 时间限制&#xff1a;3秒 空间限制&#xff1a;256M 网页链接 牛客tracker 牛客tracker & 每日一题&#xff0c;完成每日打卡&#xff0c;即可获得牛币。获得相应数量的牛币&#xff0c;能在【牛币兑换中心】&#xff0c;换取相应奖品&#xff01;助力每日有题做…

作者头像 李华
网站建设 2026/4/17 1:35:25

从零实现一个简化版VLLM EngineCoreClient:理解多进程通信核心机制

从零构建轻量级推理引擎通信框架&#xff1a;Python多进程实战解析 在分布式AI推理系统中&#xff0c;核心组件间的通信效率往往成为性能瓶颈。想象这样一个场景&#xff1a;你的推理服务需要同时处理数百个并发请求&#xff0c;而单进程Python解释器的GIL锁、内存限制等问题让…

作者头像 李华