ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

03-核心1:实现多线程的正确姿势

2021-12-29 13:04:29  阅读:173  来源: 互联网

标签:姿势 03 Runnable run Thread 线程 多线程 方法 public


03-核心1:实现多线程的正确姿势

1.网上的说法

2、4

2.正确的说法

实现多线程的官方正确方法:2种

Oracle 官网的文档是如何写的?

有两种方法可以创建新的执行线程。一种是将类声明为子类Thread。该子类应该重写类的run方法Thread,然后可以分配和启动子类的实例。
  • 方法一:实现 Runnable 接口
  • 方法二:继承 Thread

两种方法的对比:方法 1 (实现 Runnable 接口)更好

  • 解耦,将 run() 方法这个行为独立出来,而不是放在 Thread 内部 [策略模式???]
  • 节约资源,新建一个独立线程的损耗较大。
  • 无法继承其他类了
两种方法的本质对比
方法一:最终调用 target.run();
方法二:run()整个都被重写

查看 Thread 类中的 run() 方法:

private Runnable target;

......

@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

Runnable 接口里面的 run() 方法

public interface Runnable {
    public abstract void run();
}

思考题:同时用两种方法会怎么样?

由于 target != null,因此会调用 Runnable 接口里面的方法。

Thread 直接把 run() 方法给完全覆盖重写

从面向对象的思想去考虑

public class BothRunnableThread {
    public static void main(String[] args) {

        // 创建了一个匿名内部类,传入了一个Runnable对象,并重写了run()方法
        // 最后输出 ---> 我来自Thread
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我来自Runnable");
            }
        }){
            @Override
            public void run() {
                System.out.println("我来自Thread");
            }
        }.start();
    }
}

总结:最精准的描述

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

3.经典错误观点

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

通过 CallableFutureTask 创建线程,也算是一种新建线程的方式

image-20210227180516432

image-20210227180550408

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

定时器

匿名内部类

Lambda 表达式

多线程的实现方式,在代码中写法干变万化,但其本质万变不离其宗。

4.彩蛋:如何从宏观和微观两个方面来提高技术?如何了解技术领域的前沿动态?如何在业务开发中成长?

经典知识

宏观上

  1. 并不是靠工作年限,有的人工作了 5 年技术却还是只懂皮毛。
  2. 要有强大的责任心,不放过任何 bug,找到原因并去解决,这就是提高。
  3. 主动:永远不会觉得自己的时间多余重构、优化、学习、总结等。
  4. 敢于承担:虽然这个技术难题以前没碰到过,但是在一定的了解调研后,敢于承担技术难题,让工作充满挑战,这一次次攻克难关的过程中,进步是飞速的。
  5. 关心产品,关心业务,而不只是写代码。

微观上

  1. 看经典书籍(指外国人写的经典的中国译本,比如说 Java并发编程实战、自顶向下计算机网络)
  2. 看官方文档

如果前两点不能解决问题:

  1. 英文搜 googlestackoverflow
  2. 自己动手写,实践写 demo,尝试用到项目里
  3. 不理解的参考该领域的多个书本,综合判断
  4. 学习开源项目,分析源码(学习 synchronized 原理,反编译看 cpp 代码)

技术领域的最新动态

  • 高质量固定途径: ohmyrss.com(信息源筛选,为我所用)
  • 订阅技术网址的邮件: InfoQ(每周都看)

彩蛋:如何在业务开发中成长

  • 业务方向
  • 技术方向
  • 两个 25% 理论

5.常见面试问题

有多少种实现线程的方法?思路有 5

  1. 不同的角度看,会有不同的答案
  2. 典型答案是两种
  3. 我们看原理,两种本质都是一样的
  4. 具体展开说其他方式
  5. 结论

实现 Runnable接口和继承 Thread 类哪种方式更好?

  1. 从代码架构角度 【解耦,具体的任务】
  2. 新建线程的损耗 【可以反复利用这同一个线程】
  3. Java 不支持双继承


来自为知笔记(Wiz)

标签:姿势,03,Runnable,run,Thread,线程,多线程,方法,public
来源: https://www.cnblogs.com/liuxiaocs/p/204b1f26f6653c4afa61999ddb572dcd.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有