news 2026/7/4 12:32:33

Java 两种创建线程方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 两种创建线程方式

Java 创建线程两种方式:继承 Thread 子类 与 实现 Runnable 接口 核心区别对比

前言
Java 中创建线程有两种最基础的方式:

  1. 自定义类继承 Thread 类,重写run()方法
  2. 自定义类实现 Runnable 接口,实现run()方法,再传入 Thread 对象启动

一、两种方式代码实现演示

1. 方式 1:继承 Thread 类创建线程
核心特点:自定义类直接 extends Thread,重写 run,new 子类对象调用start()启动线程。

// 1. 继承Thread子类classMyThreadextendsThread{@Overridepublicvoidrun(){// 线程执行逻辑for(inti=0;i<5;i++){System.out.println(Thread.currentThread().getName()+":"+i);}}}publicclassThreadTest{publicstaticvoidmain(String[]args){// 创建线程对象MyThreadt1=newMyThread();MyThreadt2=newMyThread();// 启动线程t1.start();t2.start();}}

2. 方式 2:实现 Runnable 接口创建线程
核心特点:类实现 Runnable,重写 run,将实现类实例作为参数传入 Thread 构造器,调用 start。

// 1. 实现Runnable接口classMyRunnableimplementsRunnable{@Overridepublicvoidrun(){for(inti=0;i<5;i++){System.out.println(Thread.currentThread().getName()+":"+i);}}}publicclassRunnableTest{publicstaticvoidmain(String[]args){// 任务对象(同一个任务可以给多个线程共用)MyRunnabletask=newMyRunnable();// 传入Thread构造器创建线程Threadt1=newThread(task,"线程1");Threadt2=newThread(task,"线程2");t1.start();t2.start();}}

二、核心五大区别

1. 类继承限制不同(最关键区别)

  • 继承 Thread 类:Java 是单继承,一旦类 extends Thread,就无法再继承其他父类,扩展性受限。
  • 实现 Runnable 接口:接口是多实现,实现 Runnable 后,类还能继承其他父类、实现多个接口,无单继承限制,灵活度更高。

2. 资源共享能力不同

  • 继承 Thread:每 new 一个子类对象,都是独立线程,各自持有成员变量,无法共享同一份资源。
  • 实现 Runnable:多个 Thread 对象可以传入同一个 Runnable 任务实例,多个线程共用任务里的成员变量,天然支持多线程共享资源(比如卖票、抢库存场景)。

卖票案例对比(直观体现资源共享差异):

// Runnable实现共享资源(正确卖票)classTicketTaskimplementsRunnable{privateintticket=10;// 共享票数@Overridepublicvoidrun(){while(ticket>0){System.out.println(Thread.currentThread().getName()+"卖出第"+ticket--+"张票");}}}// 三个线程共用10张票Threadt1=newThread(newTicketTask(),"窗口1");Threadt2=newThread(newTicketTask(),"窗口2");Threadt3=newThread(newTicketTask(),"窗口3");

如果用继承 Thread 方式,每个线程对象都有独立 ticket 变量,会各自卖 10 张票,资源无法共用。

3. 职责分层不同

  • Thread 类:本身代表线程执行单元,封装线程状态、调度、start () 启动逻辑。
  • Runnable:只代表线程要执行的任务,仅包含 run () 业务逻辑,做到「线程对象」和「业务任务」解耦。

设计思想:单一职责,任务和线程分开,便于代码复用。

4. 代码复用性

  • Thread 子类:线程和业务逻辑绑定死,任务不能脱离线程单独复用。
  • Runnable 接口:任务独立,同一个任务可以交给 Thread、线程池、定时器等多种执行器执行,复用性强。

5. 底层本质

  • Thread 本身也实现了 Runnable 接口,重写了 run 方法;
  • 继承 Thread 方式重写 run,会覆盖父类 Thread 的 run;
  • 传入 Runnable 时,Thread 内部持有 Runnable 成员,执行时调用传入对象的 run。

三、优缺点总结表格

对比维度继承Thread子类创建线程实现Runnable接口创建线程
类继承限制Java单继承,继承Thread后无法再继承其他父类,扩展性差仅实现接口,不占用继承名额,类仍可继承其他父类、实现多个接口,拓展灵活
多线程资源共享每个线程对象独立,成员变量相互隔离,无法共享同一份资源多个Thread可传入同一个Runnable任务对象,天然支持多线程共享任务资源
代码耦合度线程对象与业务任务逻辑绑定,高度耦合线程和任务分离,单一职责,解耦设计
代码复用性任务逻辑依附Thread子类,无法脱离线程复用任务独立,可复用在Thread、线程池、定时器等多种执行载体
底层原理重写Thread类自身的run()方法,覆盖父类逻辑Thread内部持有Runnable引用,执行时调用传入任务的run()
实际开发推荐度不推荐,仅用于课堂简单Demo、临时测试企业开发标准写法,优先使用

四、开发场景选择建议

1. 优先使用 实现 Runnable 接口

需要共享资源(秒杀、售票、统计) 类已有父类,不能再继承 Thread 项目规范、线程池、定时任务等企业开发场景

2. 仅简单测试用 继承 Thread
逻辑极简,不需要复用、不需要共享资源的临时测试代码

五、结尾总结

两种创建线程底层都是实现 Runnable 规范 run () 方法,核心分水岭在于单继承限制和资源共享。实际业务开发一律选择实现 Runnable 接口(后续还会延伸 Lambda 简化 Runnable、Callable、线程池等知识),继承 Thread 仅适合课堂作业、简单 Demo 演示。

拓展加分内容
补充 Lambda 简化 Runnable 写法

// Lambda简化Runnable,一行创建线程publicclassLambdaThread{publicstaticvoidmain(String[]args){newThread(()->{System.out.println("Lambda实现线程任务");}).start();}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 22:02:35

IntelliJ IDEA 提交代码时,不想让 IDE 自动分析代码

打开设置&#xff1a;File -> Settings&#xff08;Mac 系统是 IntelliJ IDEA -> Preferences&#xff09;。导航到&#xff1a;Version Control -> Commit。在右侧的 Before Commit&#xff08;提交前&#xff09;区域中&#xff0c;将以下选项的勾选全部取消&#x…

作者头像 李华
网站建设 2026/6/30 22:01:09

智能审计系统(Intelligent Audit System)深度解析:构建基于自动化规则与数据风控的企业级合规检测平台

智能审计系统&#xff08;Intelligent Audit System&#xff09;深度解析&#xff1a;构建基于自动化规则与数据风控的企业级合规检测平台 在数字化转型的浪潮下&#xff0c;企业对于财务合规性、代码质量以及业务流程的审计需求日益增长。传统的人工审计方式不仅效率低下&…

作者头像 李华
网站建设 2026/7/4 12:31:37

Playwright自动化测试:从核心原理到AI智能体集成的进阶指南

1. 项目概述&#xff1a;为什么说Playwright是“无限可能”的代名词&#xff1f;如果你最近在搞自动化测试或者网页数据抓取&#xff0c;还在用Selenium或者Puppeteer&#xff0c;那我得跟你说&#xff0c;是时候抬头看看新风景了。Playwright&#xff0c;这个由微软开源的浏览…

作者头像 李华
网站建设 2026/7/2 18:29:21

wasm~tinygo写一个基于redis的全局限流的插件

基于白名单的全局限流插件&#xff0c;对指定的域名和URL路径进行全局限流控制&#xff0c;共享同一个限流计数器。核心特性按域名 URL路径进行全局限流使用 Redis Sorted Set 实现滑动时间窗口白名单机制&#xff1a;只对配置的域名和路径进行限流支持正则表达式匹配URL路径实…

作者头像 李华
网站建设 2026/7/4 1:00:00

Redis 慢查询问题诊断方法

Redis作为高性能的内存数据库&#xff0c;广泛应用于缓存、消息队列等场景。当Redis出现慢查询时&#xff0c;可能导致服务响应延迟甚至超时&#xff0c;影响用户体验。本文将介绍几种实用的Redis慢查询问题诊断方法&#xff0c;帮助开发者快速定位和解决性能瓶颈。 慢查询日志…

作者头像 李华