Java面试挂在线程创建后续,不要再被八股文误导了!创建线程的方式只有1种

news2024/10/24 21:28:06

写在开头

在上篇博文中我们提到小伙伴去面试,面试官让说出8种线程创建的方式,而他只说出了4种,导致面试挂掉,在博文中也给出了10种线程创建的方式,但在文章的结尾我们提出:真正创建线程的方式只有1种,剩下的衍生品多是套壳,那么在这篇文章中,我们来解释一下缘由!
线程创建方式可先阅读这篇文章:面试官让说出8种创建线程的方式,我只说了4种,然后挂了。。。

线程创建之源

OK!咱们闲话少叙,直接进入正题,回顾一下通过实现Runnable接口,重写run方法创建线程的方式,真的可以创建一个线程吗?来看下面这段demo。

【代码示例1】

public class Test  implements Runnable{

    public static void main(String[] args) {
        Test test = new Test();
        test.run();
    }
    @Override
    public void run() {
       	System.out.println(Thread.currentThread().getName()+":"+"runnable线程");
    }
}

输出:

main:runnable线程

虽然这里我们实现了Runnable接口并重写了run方法,但执行结果中输出的线程却是主线程,这可我们调用普通的方法一样,仍旧依靠的主线程驱动,那怎么样创建一个线程呢?

【代码示例2】

public class Test  implements Runnable{

    public static void main(String[] args) {
        Test test = new Test();
        new Thread(test).start();
    }
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+":"+"runnable线程");
    }
}

输出:

Thread-0:runnable线程

这个demo中,我们在外面套了一层Thread,然后调用start方法,最终输出的结果就是一个全新的Thread-0线程,从而实现了线程的创建。

得出结论

我们继续换Callable、FutureTask、ThreadGroup、匿名内部类或Lambda表达式等类或接口,发现均无法直接创建一个线程,必须借助Thread的start();

而例如ExecutorService线程池、ForkJoin线程池、CompletableFuture类、Timer定时器类、parallelStream并行流等等,如果有去看过它们源码的小伙伴应该清楚,它们最终都依赖于Thread.start()方法创建线程。

因此,我们在这里可以大胆的得出这样的一个结论:

在Java中创建线程的方式只有一种:通过Thread.start()调用 start()方法,会启动一个线程并使线程进入就绪状态,当分配到时间片后开始运行。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容

线程体与线程的区别

文章写到这里,我们一起再来思考一个问题,既然Runnable和Callable接口和Thread类一样需要重写他们提供的run()/call()方法,又没有创建线程,那它们究竟做了什么呢?
这个直接给出答案:他们经过重写,确定了线程体,那线程体与线程又有何区别?我们来看看文心一言怎么说。
在这里插入图片描述
总结一句话:线程体是线程的核心部分,负责执行线程的具体任务。

所以说无论是Thread中的run还是Runnable中的run,Callable中的call方法,内部所实现的都是线程需要执行的具体内容也就是线程体

总结

基于以上的分析,若我们在面试中再次遇到:“Java线程有几种创建方式?”的考题,就可以这样回答啦:

Java中创建线程的方式有很多种,在《Java技术卷》和《Java编程思想》中提供了实现Runnable、Callable接口、继承Thread类、创建线程池这四种常见方式,我们还可以通过ForkJoin线程池、CompletableFuture类、Timer定时器类、parallelStream并行流、匿名内部类或Lambda表达式等多种方式去实现,但这些都不是真正意义上的创建线程,严格意义上,Java创建线程的方式只有一种那就是通过new Thread().start()创建,Runnable、Callable接口只是重写了线程的线程体,用来确定我们线程需要执行的内容。

结尾彩蛋

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏呀。原创不易,转载请联系Build哥!

在这里插入图片描述
如果您想与Build哥的关系更近一步,还可以关注“JavaBuild888”,在这里除了看到《Java成长计划》系列博文,还有提升工作效率的小笔记、读书心得、大厂面经、人生感悟等等,欢迎您的加入!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1497800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kakarot:当今以太坊的未来

1. 引言 前序博客: Kakarot:部署在Starknet上的ZK-EVM type 3 随着 Kakarot zkEVM 即将发布测试网,想重申下 Kakarot zkEVM 的愿景为: 为什么在rollup空间中还需要另一个 zkEVM? 开源代码见: https:/…

第三百八十七回

文章目录 1. 概念介绍2. 使用方法3. 示例代码 我们在上一章回中介绍了DateRangePickerDialog Widget相关的内容,本章回中将介绍Radio Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的Radio Widget是指单选按钮,没有选中时是圆形…

PEIS源码 健康体检中心源码 C/S

目录 一、系统概述 二、系统开发环境 三、系统功能 检前管理 检中管理 检后管理 设备对接-PACS 设备对接-彩超 LIS-结果录入、审核、外送结果自动导入 一、系统概述 体检系统,是专为体检中心/医院体检科等体检机构,专门开发的全流程管理系…

创建Net8WebApi自动创建OpenApi集成swagger

问题:用Net8创建WebAPI时勾选启动OpenAPI,项目自动集成了Swagger,但是接口注释没有展示? 解决: 1.需要生成Api项目的XML文件。操作如下: 2.生成XML文件后,还需要在启动类Program.cs里面配置Sw…

快速批量将图片变成圆角怎么弄?教你一键将图片批量加圆角

在我们日常工作中,在设计图片的时候会要求将直角变成圆角,那么为什么要这么做呢?首先从圆角的设计语言上来说说,圆角看起来很现代,传达给人的感觉是温和友善的,被广泛的应用在产品中的图标、按钮等地方。而…

代码随想录day15(2)栈与队列:滑动窗口最大值(leetcode239)

题目要求:给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。 思路:首先的想法就是暴力方法,遍历一遍…

SSD LDPC软错误探测方案解读

上一篇文档中,基于SSD LDPC(Low-Density Parity-Check Codes)原理背景和纠错能力作了简单的介绍。 扩展阅读: 关于SSD LDPC纠错能力的基础探究 浅析LDPC软解码对SSD延迟的影响 本篇结合SMI发布的研究成果,通过SSD控制内部LDPC更底层的架构,来解读如何增强软错误探测能力…

ucrtbased.dll丢失的解决方法,分享5种有效的解决方法

ucrtbased.dll是一个在Windows操作系统中至关重要的系统文件,它隶属于Universal C Runtime库(UCRT),是Microsoft Visual Studio编译器为了支持C标准库功能而引入的一个动态链接库文件。这个文件内包含了大量通用且关键的运行时函数…

Navicat安装破解教程

蓝奏云下载地址https://wws.lanzoux.com/b01tqirzc或者链接https://pan.baidu.com/s/15cfQAFdQsn8xSg_2LiQZHg 提取码:q3rd链接:https://pan.baidu.com/s/1WwyCC03qcnqnWKGo-m6ZjA 提取码:pg9uNavicat16目前没有破解方法,15可以&a…

MES+APS难度地狱级,搞定它就是劫后余生呀。

一、什么是MES和APS MES(Manufacturing Execution System)和APS(Advanced Planning and Scheduling)是两种在制造业中常用的软件系统,用于优化生产过程和提高生产效率。 MES是一种用于管理和监控制造过程的系统。它与…

数学建模【模糊综合评价分析】

一、模糊综合评价分析简介 提到模糊综合评价分析,就先得知道模糊数学。1965年美国控制论学家L.A.Zadeh发表的论文“Fuzzy sets”标志着模糊数学的诞生。 模糊数学又称Fuzzy数学,是研究和处理模糊性现象的一种数学理论和方法。模糊性数学发展的主流是在…

Linux安全--Apache HTTPD多后缀名解析漏洞

环境为Kali 1.漏洞复现 在valhub官网中找到靶场环境目录 找到指定目录 使用docker拉取镜像 使用burpsuite访问本机,发现提交表单的信息只能是.jpg。不能提交.php文件 使用BurpSuite捕捉 提交.php文件发现不行 这时我们将phpinfo.php后面加一个.jpg后缀就会提交成功…

Spring事务注解@Transactional的流程和源码分析

Spring事务简介 Spring事务有两种方式: 编程式事务:编程式事务通常使用编程式事务管理API实现,比如Spring提供的PlatformTransactionManager接口,使用它操控事务。声明式事务:注解式事务使用AOP(面向切面…

奖励建模(Reward Modeling)实现人类对智能体的反馈

奖励建模(Reward Modeling)是强化学习中的一个重要概念和技术,它主要用于训练智能体(如AI机器人或大型语言模型)如何更有效地学习和遵循人类期望的行为。在强化学习环境中,智能体通过尝试不同的行为获得环境…

ai直播数字人!AI大模型应用开发高级技术

AI直播数字人是一种新兴的技术应用,通过AI大模型的应用开发,实现了数字人的虚拟化呈现。数字人作为一种虚拟人物形象,在直播平台或其他媒介中可以展现出真实人物的表情、动作和声音,并且能够与观众进行实时互动,给人带…

c语言-大小写字母的转换

目录 方法一:库函数直接转换 1、toupper的测试代码 2、tolower的测试代码 方法二:通过修改ASCII码值转换 1、自己实现大写转小写 2、自己实现小写转大写 结语 前言: 在使用c语言写代码时,通常会遇到很多将大小写字母相互…

101 向一个不存在的路径发送请求, get 得到 404, post 得到 405

前言 这是 最近碰到的一个问题, 大概是在 2022.05.30 前端这边 发送了一个业务请求过来, 这个请求路径是服务端这边不存在的 但是 奇怪的一点就是, 如果是以 get 请求发送过来, 服务端响应的是正确的 404 "Not Found", 但是 如果是以 post 请求发送过来, 服务端这边…

buildadmim生成代码时让菜单有层级

当我们使用buildadmin生成代码的时候,在菜单的部分, 有时希望它生的是一个带有层级的菜单,有时候则想生成一个没有层级的菜单 like this 经过本人测试 如果我们要生成没有层级的菜单 我们可以在高级设置中的 相对位置处更改,同时…

某资产管理系统打点过程中的免杀经历

上周,被扔过来单位内部的一个链接,让渗透一下,本以为三下五除二很快就能测完,没想到在对抗杀软时费了一番功夫,再加上杂七杂八的事儿,经过了一个星期才测完(# ̄~&#xff…

评估需求优先级的方法

Kano模型: 1.前言 在大量的需求需要进行迭代时,由于时间、人力、财力等相关因素干扰,无法在有限的时间内容对所有的需求进行满足,此时需要我们对需求进行优先级的排列。最大化的合理的提高有限资源的使用。 在常见的产品优先级…