Java 两种创建线程方式

📅 2026/6/30 22:05:24
Java 两种创建线程方式
Java 创建线程两种方式继承 Thread 子类 与 实现 Runnable 接口 核心区别对比前言Java 中创建线程有两种最基础的方式自定义类继承 Thread 类重写run()方法自定义类实现 Runnable 接口实现run()方法再传入 Thread 对象启动一、两种方式代码实现演示1. 方式 1继承 Thread 类创建线程核心特点自定义类直接 extends Thread重写 runnew 子类对象调用start()启动线程。// 1. 继承Thread子类classMyThreadextendsThread{Overridepublicvoidrun(){// 线程执行逻辑for(inti0;i5;i){System.out.println(Thread.currentThread().getName()i);}}}publicclassThreadTest{publicstaticvoidmain(String[]args){// 创建线程对象MyThreadt1newMyThread();MyThreadt2newMyThread();// 启动线程t1.start();t2.start();}}2. 方式 2实现 Runnable 接口创建线程核心特点类实现 Runnable重写 run将实现类实例作为参数传入 Thread 构造器调用 start。// 1. 实现Runnable接口classMyRunnableimplementsRunnable{Overridepublicvoidrun(){for(inti0;i5;i){System.out.println(Thread.currentThread().getName()i);}}}publicclassRunnableTest{publicstaticvoidmain(String[]args){// 任务对象同一个任务可以给多个线程共用MyRunnabletasknewMyRunnable();// 传入Thread构造器创建线程Threadt1newThread(task,线程1);Threadt2newThread(task,线程2);t1.start();t2.start();}}二、核心五大区别1. 类继承限制不同最关键区别继承 Thread 类Java 是单继承一旦类 extends Thread就无法再继承其他父类扩展性受限。实现 Runnable 接口接口是多实现实现 Runnable 后类还能继承其他父类、实现多个接口无单继承限制灵活度更高。2. 资源共享能力不同继承 Thread每 new 一个子类对象都是独立线程各自持有成员变量无法共享同一份资源。实现 Runnable多个 Thread 对象可以传入同一个 Runnable 任务实例多个线程共用任务里的成员变量天然支持多线程共享资源比如卖票、抢库存场景。卖票案例对比直观体现资源共享差异// Runnable实现共享资源正确卖票classTicketTaskimplementsRunnable{privateintticket10;// 共享票数Overridepublicvoidrun(){while(ticket0){System.out.println(Thread.currentThread().getName()卖出第ticket--张票);}}}// 三个线程共用10张票Threadt1newThread(newTicketTask(),窗口1);Threadt2newThread(newTicketTask(),窗口2);Threadt3newThread(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();}}