想不到吧,Java创建线程的方式只有一种

article/2025/9/16 23:51:44

目录

    • 前言
    • 继承Thread方式
    • 实现Runnable接口
    • 实现callable接口
    • 总结

前言

看到这个标题的小伙伴先别着急喷我……在面试的时候,我们经常会被问到这种基础题:Java创建线程的方式有几种

比较正常的答法当然是三种:

  1. 继承Thread
  2. 实现Runnable接口
  3. 实现callable接口

一般来说这种属于送分题,不过大家都是这样答的,好像有点一般般,有没有什么答法能够让面试官眼前一亮呢?当然有!

事实上,这个问题可以从两个角度去思考:

  1. Java层次
  2. 操作系统层次

大部分人的回答都是从Java提供的API层次,所以得出了三种,甚至还有加上线程池四种的结论,但你有没有想过,Java本身是不具备在操作系统上创建线程能力的。

更深入点思考:

Java提供的API分别是怎么创建线程的?

继承Thread方式

第一种方式,在构造方法实际上只是做了一些状态的初始化, 并没有涉及线程的创建,关键点其实是在Thread类的start()方法:

public synchronized void start() {if (threadStatus != 0)throw new IllegalThreadStateException();group.add(this);boolean started = false;try {start0();started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {}}}

阅读这段代码,让你最有印象的肯定是这个start0方法,名字起得这么奇怪,可惜点进去会发现它是一个native方法,我们暂时先跟到这里。

实现Runnable接口

runnable是一个接口,代码十分简单:

@FunctionalInterface
public interface Runnable {/*** When an object implementing interface <code>Runnable</code> is used* to create a thread, starting the thread causes the object's* <code>run</code> method to be called in that separately executing* thread.* <p>* The general contract of the method <code>run</code> is that it may* take any action whatsoever.** @see     java.lang.Thread#run()*/public abstract void run();
}

思考下我们平时怎么用Runnable的?是不是实现这个接口,重写run方法,然后扔到Thread类里去执行?实际上我们继承Thread类也是要重写run方法,OK,我们再看看第三个。

实现callable接口

callable的情况好像有点不一样,它没有我们熟悉的run方法了:

@FunctionalInterface
public interface Callable<V> {V call() throws Exception;
}

然而真的没有吗?我们再来想想callable的用法,好像还有个FutureTask类没有出现,我们点进来就会发现,这个类居然是Runnable的实现类!

不用想了,直接看看run方法的逻辑,果然在这里有调用call()方法,那么是实际上我们还是可以认为是run方法的效果。

总结

从上面三个方式的分析,我们最终可以粗略得出来一个结论:

无论是继承Thread类还是实现接口,最终都是通过Thread类的start方法创建线程,由run方法执行逻辑

也就是说,对于Java提供的API来说,创建线程的方式实际上只有一种,也就是刚才得出来的结论。

到这里我们已经得到可以让面试官眼前一亮的答案了,那么这个native方法的具体逻辑是怎么实现的呢?这里我就不深入分析了,大家可以去找找相关博文,大概是创建线程后得到时间片时会由一个回调的处理来执行run方法的逻辑


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

相关文章

【 java 多线程】创建多线程的方式三:使用 Callable 接口创建多线程

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

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

导语 在我们平常的面试中&#xff0c;我们经常会被面试官问道&#xff1a;你知道Java中多线程的实现方式有几种吗&#xff1f;在网上刷过面试题的童鞋们&#xff0c;一般都会说两种&#xff1a;继承Thread、实现Runnable&#xff0c;甚至还有甚者可能会说三种、四种的&#xf…

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

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

java中创建线程的4种方式

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

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

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

创建线程的方式

一般来说&#xff0c;创建线程有三种方式&#xff1a;继承 Thread 类、实现 Runnable 接口和实现 Callable 接口。 继承 Thread 类&#xff1a;继承 Thread 类&#xff0c;重写 run() 方法&#xff0c;调用 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种方式 二.创建线程方式有什么区别&#xff1f; 一.创建线程的4种方式 &#xff08;1&#xff09;写一个类继承Thread&#xff0c;覆盖重写run方法 &#xff08;2&#xff09;创建一个Runnable类型的对象,实现run()方法,传入Thread的构造方法中 &#x…

创建线程几种方式

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

线程创建的四种方式

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

四种线程创建方式

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

创建线程的四种方式

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

线程创建常用的四种方式

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

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

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

金融银行测试面试题分享

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

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

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

金融行业软件测试

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

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

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

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

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

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

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