【并发】-创建线程最基本的两种方式

前言

Oracle官方文档上表明,有两种方法可以创建新的线程。

  • 将类声明为Thread的子类(继承Thread),该子类重写Thread类的run方法。
  • 类实现Runnable接口,进而实现run方法。在创建Thread类的同时,作为构造参数传递给Thread。

应用

/**
 * @Description: 继承thread类实现
 * @Author: zlt
 * @Date: 2021/1/18 22:06
 */
public class ThreadStyle extends Thread{

    @Override
    public void run(){
        System.out.println("用Thread类实现线程");
    }

    public static void main(String[] args) {
        new ThreadStyle().start();
    }

}
/**
 * @Description: 实现Runnable接口实现
 * @Author: zlt
 * @Date: 2021/1/18 22:05
 */
public class RunnableStyle implements Runnable{
    public static void main(String[] args) {
        Thread thread = new Thread(new RunnableStyle());
        thread.start();
    }

    @Override
    public void run() {
        System.out.println("用Runnable方法实现线程");
    }
}

Thread有两类构造函数,一个构造函数参数是Runnable实现类作为参数;一个构造函数是空构造,Thread子类直接调用start方法运行的。

继承Thread类来创建线程的缺点:

  1. 代码架构角度考虑,具体执行任务应该和线程创建、执行、销毁是解耦的
  2. 继承Thread类,每次新建一个任务,只能新建一个独立的线程,新建独立线程开销比较大,需要维护线程的创建、执行、销毁,如果利用实现Runnable方式,可以使用后续的线程池之类的工具,大大减少创建、销毁线程的带来的损耗
  3. 继承Thread之后,Java不支持双继承,子类无法继承其他的类,限制了可扩展性

两种方法的本质区别:

  1. 实现Runnable接口,最终通过当Trhead构造参数调用start方法,进而调用target.run()
  2. 继承Thread类,导致run()整个都被重写

思考

  1. 同时使用两种方法会怎样?
/**
 * @Description: 两种方式同时执行
 * @Author: zlt
 * @Date: 2021/1/18 22:35
 */
public class BothRunnableThread {

    /**
     * 返回值:“我来自Thread”
     * 因为父类Thread已经被匿名类重写了,即便Thread类的构造参数传入target不为空,也不会返回:“我来自Runnable”
     * @param args
     */
    public static void main(String[] args) {
        new Thread(new Runnable() {
            /**
             * 传入Runnable对象
             */
            @Override
            public void run() {
                System.out.println("我来自Runnable");
            }
        }){
            /**
             * 匿名内部类重写了Thread的run方法
             */
            @Override
            public void run(){
                System.out.println("我来自Thread");
            }
        }.start();
    }
}

小结

  1. 创建线程的方式,通常可以分为两类(Oracle也是这样说的)
  2. 准确的讲,创建线程只有一种方式,那就是构造Thread类,实现线程的执行单元有两种方式。
    1. 实现Runnable接口的run方法,并把Runnable实例传给Thread
    2. 重写Thread的run方法(继承Thread类)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

女汉纸一枚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值