我是靠谱客的博主 风趣橘子,最近开发中收集的这篇文章主要介绍线程8大核心基础知识【1】-- 实现多线程的方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这些问题都是面试常考问题。跟我一起学习,一起攻破Java并发吧!
为了能拿到offer,为了美好生活,为了明天,加油!

1.实现多线程的方法有1种2种还是4中?

百度搜索一下先:在此图中有2种,3种,4种各不相同,鱼龙混杂
在这里插入图片描述

那到底为有几种呢?答案是2种,一些人又质 疑了,为什么信你?不权威!
辩论:Oracle官网的文档是如何写的呢?这就很权威了吧!
在这里插入图片描述

Oracle官网的文档是如何写的?
  • 方法一 :实现Runnable接口
    在这里插入图片描述
  • 方法二 :继承Thread类
    在这里插入图片描述
两种方法的对比
  • 方法一 :(实现Runnable接口) 更好 优先选择
    优点:继承其他类,同一实现该接口的实例可以共享资源。
    缺点:代码复杂

  • 方法二 :继承Thread类
    优点:代码简单
    缺点:该类无法集成别的类

本质对比:

  • 方法一 :最终调用target.run();
  • 方法二 :run()整个都被重写
    在这里插入图片描述
思考题:同时用两种方法会怎么样?

在这里插入图片描述
这是为什么呢?

  • 从面向对象的思想去考虑,被Thread的run方法覆盖了,target传入也不会执行,方法被重写了
总结:最精准的描述

如果被问到有几种实现线程的方法呢?
可以回答:
有两种方法,Oracle官方文档我看过了,他也是这样说的,方法一是继承Thread,方法二是实现Runnable接口。
准确的讲,创建线程只有一种方式那就是构造Thread类,而实现线程的执行单元有两种方式

  • 方法一:实现Runnable接口的run()方法,并把Runnable实例传给Thread类
  • 方法二:重写Thread的run()方法 (继承Thread类)
典型错误观点分析
  • 线程池创建线程也算是一种新建线程的方式
    在这里插入图片描述
    推翻:源码可见,也是new Thread®, r为Runnable
    在这里插入图片描述
  • 通过Callable和FutureTask创建线程,也算是一种新建线程的方式
  • 无返回值是实现runnable接口,有返回值是实现callable接口,所以callable是新的实现线程的方式

推翻:以上两点本质是离不开Runnable接口的
在这里插入图片描述

  • 定时器
    推翻:本质也离不开那两类方法
    在这里插入图片描述
  • 匿名内部类
    推翻:很容易就可以看出,连包装都没有,和那两种方法没太大区别,这里就不代码演示了。
  • Lambda表达式 我这版本低 不过是可以打印线程名称的在这里插入图片描述
    总结:虽然这些都可以创建线程,并且都把线程的名字打印出来了。表面可以是一种实现方式,都是在代码中写法千变万化,但其本质万变不离其宗。

实现多线程-常见面试问题

  • 有多少种实现线程的方法?思路有5点
  1. 从不同的角度看,会有不同的答案
  2. 典型的答案是两种
  3. 我们看原理,两种本质都是一样的
  4. 具体展开说其他方式
  5. 结论
  • 实现Runnable接口和集成Thread类哪个方式更好?
  1. 从代码架构角度
  2. 新建线程的损耗
  3. Java不支持双继承

具体答案的话,每个人的口述话语都不一样,就自己去上面查询总结吧!

最后

以上就是风趣橘子为你收集整理的线程8大核心基础知识【1】-- 实现多线程的方法的全部内容,希望文章能够帮你解决线程8大核心基础知识【1】-- 实现多线程的方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部