线程基础一:创建线程的方式真正到底有几种???

创建线程的方式到底有几种???

oracle官方说的是两种
oracle的jdk文档

使用Runnable接口创建线程

实现Runnable接口,代码如下

package createThreads;

/**
 * @Auther: keith
 * @Date: 2020/5/7 20:14
 * @Description: 使用runnable接口创建线程
 */
public class RunnableStyle implements Runnable {

    @Override
    public void run() {
        System.out.println("使用runnable创建线程");
    }

    public static void main(String[] args) {

        new Thread(new RunnableStyle()).start();
    }
}

继承Thread类创建线程

继承Thread类,重写run方法,代码如下

package createThreads;

/**
 * @Auther: keith
 * @Date: 2020/5/7 20:16
 * @Description:
 */
public class ThreadStyle extends Thread {
    @Override
    public void run() {
        System.out.println("使用thread创建线程");
    }

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

创建线程的哪种方式更好?

答案是:实现runnable接口。为什么呢?

  • 解耦,实现runnable接口,更专注于行为,只关心执行的任务(也就是run方法),与Thread类的启动、运行等等职责分开。
  • 线程池的对runnable接口的支持。
  • 扩展性更好,java不支持双继承,如果以后想继承其他类,就做不到了

两种方式本质的对比

1. Runnable:最终调用的是target(也就是Runnable接口的实现类)的run方法。

在这里插入图片描述

2. Thread:直接重写了Thread类的整个run方法

同时使用Runnable接口以及Thread类实现线程,会发生什么?

执行结果,最终调用的是Thread的run方法,如图
在这里插入图片描述


面向对象的角度思考

Thread的run方法源码,如图
在这里插入图片描述

  • 从图中可以看到,target表示的是Runnable的实现类。target!=null,就调用target的run方法,我们运行上方程序的时候,确实是传了target过来,但是,我们继承了Thread类重写了run方法,把runnable实现类的run方法覆盖了。所以,最终执行的方法是我们重写了Thread的run方法。

总结

  • 实现线程只有两种方式,oracle官方这么说的
    1. 实现Runnable接口
    2. 继承Thread类
  • 其余创建线程的方式,如使用线程池、Callble等等,都只是表面现象,都是代码成面的封装,底层代码,最终的道理都是通过new Thread实现了线程,根本的无法逃脱Thread类和Runnable接口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值