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

Java 多线程:继承 Thread 与实现 Runnable 两种创建方式完整对比

一、前言

本文为 Java 多线程课程作业,对比两种基础线程创建方式:继承 Thread 子类、实现 Runnable 接口。分别给出完整可运行代码,从代码结构、类继承限制、资源共享、扩展性等维度分析核心区别,总结开发中推荐使用 Runnable 的原因。

二、两种创建方式代码实现(包名 com.javablog)

方式 1:继承 Thread 类创建线程

package com.javablog; // 自定义类继承Thread,重写run方法 public class MyThread extends Thread { // 共享票数 private int ticket = 10; @Override public void run() { while (ticket > 0) { System.out.println(Thread.currentThread().getName() + " 卖出第" + ticket + "张票"); ticket--; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { // 创建多个线程对象,每个对象拥有独立ticket变量 MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); t1.setName("窗口1"); t2.setName("窗口2"); t1.start(); t2.start(); } }

运行现象:两个窗口各自售卖 10 张票,总票数 20 张,无法共享资源。


方式 2:实现 Runnable 接口创建线程

package com.javablog; // 实现Runnable接口,重写run方法 public class MyRunnable implements Runnable { // 共享票数,所有线程共用这一个变量 private int ticket = 10; @Override public void run() { while (ticket > 0) { System.out.println(Thread.currentThread().getName() + " 卖出第" + ticket + "张票"); ticket--; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { // 只创建一份任务对象 MyRunnable task = new MyRunnable(); // 多个Thread共用同一个任务,共享ticket资源 Thread t1 = new Thread(task, "窗口1"); Thread t2 = new Thread(task, "窗口2"); t1.start(); t2.start(); } }

运行现象:两个窗口共同售卖 10 张票,多线程共享同一份资源。

三、核心区别对比

对比维度继承 Thread 子类实现 Runnable 接口
继承限制Java 是单继承,继承 Thread 后无法再继承其他父类,扩展性差仅实现接口,不占用类继承名额,可同时继承其他类,扩展性强
资源共享每个线程对象独立,成员变量互不共享,多线程操作同一资源需要静态变量多个 Thread 可共用同一个 Runnable 任务对象,天然共享成员变量,适合售票、抢单等场景
职责分离线程对象与业务逻辑耦合在一起,线程控制、业务代码写在同一个类解耦:Thread 只负责线程调度,Runnable 仅存放业务执行逻辑,符合单一职责
代码复用业务逻辑绑定线程类,复用性弱任务可重复交给多个线程、线程池执行,复用性高
开发推荐度仅简单一次性测试场景使用项目、竞赛标准首选方案

四、关键细节解析

1.单继承限制(最核心短板)
Java 不支持多类继承,如果业务类已经继承其他父类,就不能再继承 Thread;而 Runnable 是接口,一个类可以实现多个接口,无继承冲突。
2.资源共享差异原理
继承 Thread:每次new MyThread()都会新建对象,成员变量是实例私有;
实现 Runnable:只创建一个任务实例,传入多个 Thread,所有线程操作同一个对象的成员变量,天然共享数据。
3.解耦设计思想
Thread 类是 JVM 提供的线程调度器,负责开启、休眠、中断线程;Runnable 只承载需要执行的业务代码,将「线程调度」和「业务逻辑」分开,代码更清晰。

五、运行结果示例

继承 Thread 输出(不共享票)

实现 Runnable 输出(共享票)

六、总结

1.继承 Thread 类:写法简单,但受 Java 单继承限制,无法共享实例资源,扩展性差,仅适合简单测试;
2.实现 Runnable 接口:无继承限制、天然支持多线程资源共享、职责解耦、任务可复用,是企业开发、竞赛通用标准写法;
3.实际开发中,一律优先选择实现 Runnable 接口的方式创建线程。

http://www.gsyq.cn/news/1604865.html

相关文章:

  • 自动定期备份服务器数据
  • python下载M3U8视频脚本
  • AI截图工具免费下载,基于DeepSeek的OCR截图软件支持Mac和Win
  • 【单片机毕业设计】基于 STM32 的超重声光报警电子秤设计与实现,基于 STM32 的阈值式重量监测报警系统设计(013701)
  • Burp Suite实战:验证码场景下的自动化渗透测试与绕过技术
  • ABB工业机器人编程基础(十三)功能程序(FUNC)
  • 第八、九次作业
  • 考四级的资料|过四级必备资料书|英语六级备考资料
  • MySQL数据库期末复习②
  • 英语四级考资料|四级考试英语资料|英语四级考试资料
  • 2026学生降AI率工具盘点: 学术打磨+逻辑优化哪家强?
  • 使用Hermes 排查OpenClaw 从 5.12 升级到 6.10 的故障
  • 第八次作业和第九次作业
  • 【小白也能轻松玩转龙虾】虾壳云一键部署办公增效,批量文件处理 OpenClaw v2.7.9 教学(附最新安装包)
  • Linux基础指令(一):命令行入门
  • 【ChatGPT结构化提示词黄金法则】:20年AI工程实战提炼的7大不可绕过的设计范式
  • FPGA加速同态矩阵向量乘法的技术解析与实践
  • 别只会用Office!打工人必学的5个AI办公技巧
  • 液冷板焊接的质量账:70%的失效根源在钎焊,激光焊接怎么把良率拉到99%
  • FFmpeg视频切片与AES-128加密完整实战指南
  • 2026论文双降终极榜单:10款降AIGC工具,智能改写快速定稿成文
  • 如何用AI写代码 ? AI编程提示词怎么写 ?AI写的代码如何调试
  • 从弗朗西斯·奇切斯特的环球航行看:技术、勇气与人类精神的现代启示
  • 基于 Ragas 与通义千问实现 RAG 系统答案正确性自动评估
  • 每日更新!免费股票日k、分时k线数据,etf分钟数据,截至到2026-07月最新数据,含全沪京深7000+股票
  • 基于鸿蒙十二阶均衡体系:境外全域隐性渗透的安全风险与均衡治理路径——基于全域均衡数理模型推演(十三)
  • 新手也能上手!2026年实测靠谱的专业降AI率平台
  • Ubuntu SSH 强制密钥登录:配置不生效的排查与修复
  • DICOM图像核心参数实战指南:从像素到诊断的精准度量
  • 亿元合家欢动画《悟空大圣》正式定档7月24日暑期上映