美文网首页多线程
实现多线程的正确姿势

实现多线程的正确姿势

作者: 刘一帆315 | 来源:发表于2020-08-11 21:39 被阅读0次

实现多线程的方法到底有几种?

度娘告诉我们多线程的实现方式

关于多线程的实现方式,互联网上的资源鱼龙混杂,有两种的还有三种四种的,最多的还有六种的。但是正确的答案只可能是三种四种或者六种中的其中个,那么Oracle官方是怎么说的呢?


JDK官方文档

一共有两种实现多线程的方法,一种是实现Runnable接口,一种是继承Thread类。

方法一:实现Runnable接口

/**
 * 描述:     用Runnable方式创建线程
 */
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类

/**
 * 描述:     用Thread方式实现线程
 */
public class ThreadStyle extends Thread{

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

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

我们再来看一下源码


Thread类

当我们使用实现Runnable接口方式创建线程时会传入一个target对象,然后判断不为空执行run方法。继承Thread类创建线程时会重写run方法,子类覆盖父类,没有了判断过程。

方法一(实现Runnable接口)更好。
1.Java只支持单根继承,所以实现Runnable接口更加灵活。方法一最终调用target.run(); 方法二run()整个方法都被重写。
2.方法一传入Runnable实例可以重复利用线程,如果使用方法二则会不断的new Thread。
3.run方法中执行的是具体的任务,线程的声明周期是Thread类的事情。这两个事情目的不同,站在代码架构的角度,应该解耦。

我们来看一种特殊的情况,创建线程的时候既实现了Runnable接口又继承了Thread类。

/**
 * 描述:     同时使用Runnable和Thread两种实现线程的方式
 */
public class BothRunnableThread {

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我来自Runnable");
            }
        }) {
            @Override
            public void run() {
                System.out.println("我来自Thread");
            }
        }.start();
    }
}

运行结果是:我来自Thread。因为虽然我们实现了Runnable接口,但是重写了run方法,上边Thread类的三行代码被覆盖。最终执行的只有我们重写的run方法。

方法的总结

实现多线程通常我们可以分为两类,Oracle也是这么说的。准确的讲,创建线程只有一种方式那就是构造Thread类,而实现线程的执行单元有两种方式。
       方法一:实现Runnable接口的run方法,并把Runnable实例传给Thread类。
       方法二:重写Thread的run方法(继承Thread类)。

典型的错误观点分析

线程池创建线程也算是一种新建线程的方式

线程池的内部线程工厂也是使用new Thread()的方法创建线程的。

通过Callable和FutureTas看创建线程,也算是一种新建线程的方式。

通过查看类的关系,本质上也是实现Runnable接口的。

无返回值是实现runnable接口,有返回值是实现callable接口,所有callable是新的实现线程的方式。

和上边一样,并没有创新。

定时器

和线程池的观点并没有不同。

匿名内部类

Lambda表达式

只是表象不同,本质都是利用两种方法创建线程。多线程的实现方式在打吗中写法千变万化,但其本质万变不离其宗。

相关文章

  • 实现多线程的正确姿势

    实现多线程的方法到底有几种? 关于多线程的实现方式,互联网上的资源鱼龙混杂,有两种的还有三种四种的,最多的还有六种...

  • Android消息机制(六) 总结

    参考Android线程的正确使用姿势Android性能优化典范之多线程篇 Android多线程编程的总结Andro...

  • 我眼中的NSNotificationCenter

    正确的使用通知方法 通知中心与多线程 通知中心需要释放吗? 如何实现自动移除监听? 通知的实现原理 正确的使用通知...

  • iOS 使用高德地图正确姿势(三)

    iOS 使用高德地图正确姿势(一)iOS 使用高德地图正确姿势(二) 实现大头针始终在地图中心,拖动地图实时poi...

  • 姿势不正确,怎么奋斗?

    文/风言锋语 体育锻炼讲求姿势正确,模特表演也要求姿势正确,普通人奋斗也需要正确姿势?答案是肯定的。姿势不正确,奋...

  • 流放之路 正确姿势

    辛迪加正确姿势 辛迪加正确姿势.png 安全屋奖励.png 辛迪加掉落.png 猎魔正确姿势 重要猎魔配方.png

  • 实现财富自由的正确姿势!

    财富自由是个金光闪闪的词汇,记得第一次听说财富自由是刚毕业第一年,那个时候找了一份销售的工作。当时带我们的那个组长...

  • 实现Flutter弹窗的正确姿势

    Dialog 在现代的视觉交互中是很常用的一种 UI。 做移动端开发的同学一定对它不陌生。 本篇将会探索一下,在 ...

  • 实现成交的正确姿势

    成交是销售的最终目的,成交前所做的一系列准备都是手段和途径。只有当手段正当,途径正确才能达到目的。这份清单告诉你缩...

  • Java中实现多线程的正确姿势(反驳网上的某些观点)

    “java中实现多线程到底有几种方式?为啥我去搜索答案说几种的都有。。。”最近朋友问我这样一个问题,当时我脑子里条...

网友评论

    本文标题:实现多线程的正确姿势

    本文链接:https://www.haomeiwen.com/subject/jjqudktx.html