关于创建线程的方式有几种

article/2025/9/16 23:48:34

导语

在我们平常的面试中,我们经常会被面试官问道:你知道Java中多线程的实现方式有几种吗?在网上刷过面试题的童鞋们,一般都会说两种:继承Thread、实现Runnable,甚至还有甚者可能会说三种、四种的,对于说三种四种的一般都是把什么ExecutorService什么的包含在内了。

这时可能有人就想了,既然这么说,那么到底是几种呢?那么本篇文章就将会从不同的角度来和大家说明一下,在我们日常的Java开发中,这实现多线程的方式到底有几种。

一、关于官方的解答

在正式开始之前,我们先来看下Oracle官网是如何表述的,那就来给大家看两段段话:

对于上方的两段话的基本意思就是:有两种方法可以创建新的执行线程。一种是将类声明为子类Thread,该子类需要重写run方法,另一种是实现Runnable接口。说到这里那些在面试中说了这两种的童鞋便会非常的自豪,当然的确如此,因为这是官方文档所阐述的,这也是我们要在学习的时候要以官方文档为主,而不是网上的一些博客,尤其是一些复制来复制去的博客。当然,也可以嫌弃我的博客,因为博主也是只是有限。

对于官网所说的两种实现方式,这里简单的用代码演示:

public class RunnableDemo implements Runnable {public static void main(String[] args) {Thread thread = new Thread(new RunnableDemo());thread.start();}@Overridepublic void run() {System.out.println("实现Runnable方式!");}
}public class ThreadDemo extends Thread {@Overridepublic void run() {System.out.println("继承Thread方法!");}public static void main(String[] args) {new ThreadDemo().start();}
}

这里我抛个疑问官网上面的第一段的第一句话,给你真正的理解是什么?

二、从源码来看看

从上面的代码中,我们可以看到的就是继承Thread,它是重写了run方法的,就相当于我们在调用start方法的时候,是不会去调用jdk中的Thread类的run方法了,而实现Runnable的方式是需要构造一个Thread了,然后传入我们实现了Runnable的这个类,当我们执行这种实现方式的时候,你会发现它会先调用jdk中的Thread类的run方法,然后才调用RunnableDemo这个类里面的run方法。这时有人可能就想说这个有什么意义呢!细心的童鞋会发现,其实我们jdk中的类也是去实现Runnable这个接口的,但是这个接口中只有一个方法,那就是run方法,而Thread类中的其他方法都是Thread自己的。我们看下Thread类的实现截图:

其实到这里算是很明白了,我们所谓的实现Runnable,其实不过是一种实现线程运行的方式,并不是真正意义上的创建线程,这个时候我们来回味一下Oracle官网的那第一句话:There are two ways to create a new thread of execution。此时一看是不是感觉意味深长,因为你会发现他的着重点其实是execution这个词。我们上面说了实现Runnable是先执行Thread类的run方法,那我们来看下Thread类中的run方法代码如何:

    /* What will be run. */private Runnable target;@Overridepublic void run() {if (target != null) {target.run();}}

看上去是不是很简单,那这里的target是个什么东西呢?你点进去的话,其实它就是个Runnable的声明,但是如果你断点看过的话,或发现当在运行使用实现Runnable方式的时候,此时这个target是当前运行的RunnableDemo这个类,这是因为我们在构造Thread类的时候所传的就是RunnableDemo这个类。

这次我们对于实现创建线程的方式有几种这个答案就比较清晰明朗了,其实在面试的时候,我们可以回答:按照Oracle官网来看,是可以分为两类的,但准确来说创建线程的方式有且只有一种,那就是构建Thread类,所说的有两种方式那是实现线程单元执行的方式:

1.一类是实现Runnable接口的run方法,并把此实例传给Thread类。

2.第二种就是重写Thread的run方法(继承Thread类)

当然网上还有说三种四种的,这里面有包含Executors、Callable、FutureTask等,但如果你深究代码的话,你会发现其实Executors它的底层也是通过构造Thread来实现线程的创建的,而FutureTask的底层是实现了Runnable接口的,而网上其他的所说的无独有偶,要么是构建Thread类要么实现Runnable,所以他们并不能算真正意义上的创建线程的方式。

三、两种方式那是实现线程单元执行的方式的对比

前面我们说了实现线程单元执行的方式有两种,那么这两种在我们的平常开发中哪一种更实用呢?或者说更推荐那种方法呢?

前面我们把两种的特点都说了,实现Runnable接口的run方法的其最终还是调用target.run()方法,而继承Thread类是重写整个run方法。那么这两个方法哪个方法更好呢?或者说更推荐哪个方法?其实在日常开发中,推荐的还是实现Runnable接口的方式,那么继承Thread类的方式为什么不好呢?我们来做以下几点分析:

  • 从代码架构层面上看:具体的任务(run方法)应该和“创建、运行线程的机制(Thread类)”解耦,意思就是继承Thread类不具有解耦性,实现Runnable接口的就是一解耦的方式实现的。
  • 如果使用继承Thread方式,那么每次创建新的任务,只能独立新建一个线程,这样的做法消耗比较大,而Runnable便会消耗较小。
  • 继承Thread类以后,因为Java语言不支持双继承,这样就无法再继承其他的了,这样也就限制了器扩展性,而日常开发中我们还是很看重高扩展性的。

结论

本文从一下几个方面来进行了说明:

  • 从官网上看解答
  • 从源码层面看实现的方式,其实本质上那两种方式并没区别,都是调用start方法来新建线程。
  • 比较了两种方法的优劣


http://chatgpt.dhexx.cn/article/igXEL6RF.shtml

相关文章

Java创建线程的方式只有一种:Thread+Runnable

Java创建线程的方式其实只有一种 👨‍🎓一、继承Thread👨‍🎓二、实现Runnable接口👨‍🎓三、实现Callable接口👨‍🎓四、通过线程池创建👨‍🎓五、总结 一般…

java中创建线程的4种方式

写在前面的话 java线程创建方式有几种?这种问题在面试中经常被问到,你可能心里马上反映出两种方式(实现Runnable、继承Thread),当你把这两种叙述给面试官听后,面试官会觉得你该掌握的知识已经有了&#xf…

【 java 多线程】创建多线程的方式四:使用线程池创建多线程

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

创建线程的方式

一般来说,创建线程有三种方式:继承 Thread 类、实现 Runnable 接口和实现 Callable 接口。 继承 Thread 类:继承 Thread 类,重写 run() 方法,调用 start() 方法启动线程。 public class MyThread {public static cla…

【JAVAEE】创建线程的方式及线程的常用方法

目录 1.创建线程的四种方式 1.1继承Thread类 1.2实现Runnable接口 1.3匿名内部类 1.4lambda表达式 2.多线程的优势-增加运行速度 3.Thread类及常用方法 3.1构造方法 3.2常见属性 演示后台线程 演示线程是否存活 3.3线程中断 3.4线程等待-join() 3.5获取当前线程 …

创建线程的方式有那些?

目录 一.创建线程的4种方式 二.创建线程方式有什么区别? 一.创建线程的4种方式 (1)写一个类继承Thread,覆盖重写run方法 (2)创建一个Runnable类型的对象,实现run()方法,传入Thread的构造方法中 &#x…

创建线程几种方式

创建线程的几种方式: 方式1:通过继承Thread类创建线程 步骤:1.定义Thread类的子类,并重写该类的run方法,该方法的方法体就是线程需要执行的任务,因此run()方法也被称为线程执行体 2.创建Thread子类的实例&a…

线程创建的四种方式

java中创建线程的四种方法以及区别 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用四种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线程 3&am…

四种线程创建方式

一. 继承Thread类 继承Thread类创建线程的步骤: 创建一个自定义类继承Thread类,重写run()方法,将所要单独线程运行写入run()方法中;创建Thread类的子类的对象;调用该对象的start()方法,该start()方法表示开启线程,然后调用执行run方法; Testpublic void test() {Thread.curre…

创建线程的四种方式

我们创建线程池一般有四种方式,分别是: 1.继承Thread类,重写run()方法; 2.实现Runnable接口,重写run()方法; 3.实现Callable接口,重写call()方法; 4.使用线程池创建线程;…

线程创建常用的四种方式

java中创建线程的四种方法以及区别 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用四种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线程 3&…

银行测试核心项目之测试阶段分享

最近有小伙伴说「想了解核心系统建设中,冒烟、SIT、UAT、回归测试的重点,如何设计测试案例,或相关的资料推荐等」。 这个话题很笼统,测试这一块儿除了业务测试,还有性能测试、安全测试等;以及不同的角色对…

金融银行测试面试题分享

1、网上银行转账是怎么测的,设计一下测试用例。 回答思路: 宏观上可以从质量模型(万能公式)来考虑,重点需要测试转账的功能、性能与安全性。设计测试用例可以使用场景法为主,先列出转账的基本流和备选流。…

2022年软件测试——精选金融银行面试真题

前言 小伙伴们好久不见呀,现已经到了八月份了过了这一个月就是金九银十了,在这里呢笔者给大家准备了一份软件测试金融方面的面试题,笔者在这里就不多说废话了哟,咱们直接进入正题哈。 1、P2P你们也测试后台管理吗?个人…

金融行业软件测试

金融行业软件测试 一、什么是金融行业二、金融行业的业务特点1. 金融行业的业务特点 三、金融行业测试主要测试范围1. 功能测试2. 业务验证测试3. 客户端测试4. 接口测试5. 性能测试6. 安全性测试 四、金融行业软件测试的现状五、第三方测试的优点 一、什么是金融行业 金融业是…

走出新手村,软件测试银行项目怎么测试 + 面试题(答案)

前言 业务: 银行类app具体模块业务讲解: 掌上生活(消费/理财) 消费: 与电商平台业务类似 饭票:GPS定位城市服务、饭票购买消费、餐厅查询、代金券、周三五折、banner图、我的饭票、我的抵扣券 影票 …

【工作总结】银行软件测试工作总结

最近换工作进入到外包公司,驻点到银行进行集成测试工作,为了让自己更熟悉金融行业,特别是银行业相关业务,以及总结自己测试的一些经验,希望将自己了解和学习的内容记录下来。主要从以下几个方面学习: 一、…

大咖or学员?金融银行软件测试案例分享!

2019年4月14日汇智动力学院在成都校区开展了本年度的第一次线下技术交流沙龙(银行金融测试方向); 刘德宝老师做技术分享 通过在上个月末举办的老学员周末娱乐活动(雀圣大赛),我们做了一系列的问卷调查&…

银行软件测试面试问题

测试技术面试题 1、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行,即是通常说的软件的可移植性。 兼容的类型,如果细分的话&#x…

浦发银行软件测试面试真题(小编面试亲测)

对于想要面试去银行面试的小伙伴们看过来,今天为大家总结了浦发银行的面试题,其实很多面试题很多公司都差不多。主要看自己如何灵活回答。以下的问题小编盆友之前面试非浦发银行的银行项目也有被问到过,是在一面的时候被问到的。答案仅作为参…