java中继承Thread和实现Runnable的区别

本文对比了Java中实现多线程的两种方式:继承Thread类与实现Runnable接口的区别。通过示例代码展示了两种方式的具体实现,并分析了它们在实际应用中的优劣。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/litaoshoujiao/article/details/8542859          http://blog.sina.com.cn/s/blog_9cbb6a210102ux44.html本博文转自这两个链接

在java中可有两种方法实现多线程,一种是继承Thread类,另一种就是实现Runnable接口。他们之间存在不少区别,建议使用Runnable。

区别与联系:

1, 一个类只能继承一个父类,存在局限;一个类可以实现多个接口

首先建立多线程,

extendThread类:

public class ThreadDemo extends Thread{
    private String name;
    public static int count = 10;
    public ThreadDemo(String name){
        this.name = name;
    }
    public void run(){
        for(int i = 0;i<count;i++){
            System.out.println("线程"+this.name+": is running."+i);
        }
    }
}


实现Runnable接口:
Java <wbr>多线程实现接口Runnable和继承Thread区别
测试程序:

Java <wbr>多线程实现接口Runnable和继承Thread区别

运行的结果:

线程aa: is running.0
线程bb: is running.0
线程bb: is running.1
线程bb: is running.2
线程bb: is running.3
线程bb: is running.4
线程bb: is running.5
线程bb: is running.6
线程aa: is running.1
线程bb: is running.7
r2卖票:ticket24
r2卖票:ticket23
r1卖票:ticket25
r1卖票:ticket21
r1卖票:ticket20
r1卖票:ticket19
r1卖票:ticket18
r1卖票:ticket17
r1卖票:ticket16
r1卖票:ticket15
r1卖票:ticket14
r1卖票:ticket13
r1卖票:ticket12
r1卖票:ticket11
r1卖票:ticket10
r1卖票:ticket9
r1卖票:ticket8
r1卖票:ticket7
r1卖票:ticket6
r1卖票:ticket5
r1卖票:ticket4
r1卖票:ticket3
r2卖票:ticket22
r2卖票:ticket2
r2卖票:ticket1
线程bb: is running.8
线程aa: is running.2
线程aa: is running.3
线程aa: is running.4
线程aa: is running.5
线程aa: is running.6
线程aa: is running.7
线程aa: is running.8
线程aa: is running.9
线程bb: is running.9

可以看出来RunnableDemo和ThreadDemo同样创建的是循环,但是继承Thread执行多线程相当于做了两次,就需要安装线程锁。但是Runnable就直接两个线程直接去卖票,直接达到目的,不必安装线程锁了。

所以以后涉及到多线程操作的时候我会倾向于实现Runnable接口。

继承`Thread`实现`Runnable`是Java中创建线程的两种常见方式,它们有各自的特点联系。 **继承Thread**: 当你直接从`Thread`类继承并重写其`run()`方法时,可以直接创建该类的对象并通过它启动一个新的线程。这种方式的好处是简单明了,因为`Thread`类已经包含了生命周期管理的部分,如启动、暂停恢复等操作。然而,如果你需要同时实例化多个线程,那么每个线程都需要单独创建Thread对象,这可能导致内存消耗较大。 ```java public class MyThread extends Thread { public void run() { // 线程体 } } // 使用示例 MyThread thread = new MyThread(); thread.start(); ``` **实现Runnable**: 通过实现`Runnable`接口并提供`run()`方法,然后将这个实现了`Runnable`的类作为参数传递给`Thread`构造函数,创建Thread对象。这种方式可以避免上述单一继承的问题,一个类可以同时实现多个接口。多个线程共享同一个`Runnable`实例,只需要创建一个Thread对象即可。此外,还可以方便地切换运行的线程,因为它并不绑定于特定的Thread类。 ```java public class MyRunnable implements Runnable { public void run() { // 线程体 } class MyThreadExecutor { private Thread thread; public void start() { thread = new Thread(new MyRunnable()); thread.start(); } } ``` **联系**: 两者都允许你在新的线程上执行自定义的任务。但是,`Runnable`接口设计得更为灵活,更适合复用解耦,特别是当多个任务需要共用一个线程池时。而`Thread`继承方式适合简单的单线程使用场景。 **相关问题--:** 1. 为什么在并发编程中推荐使用`Runnable`接口而不是直接继承`Thread`? 2. 实现`Runnable`接口后,如何让Thread实例化并开始执行? 3. 使用哪种方式更容易控制线程的生命周期管理?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值