当阿里面试官问我:Java创建线程有几种方式?我就知道问题没那么简单

java 同步阻塞并唤醒指定线程 java 多线程 同步阻塞 唤醒 立即下载

昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的问题:你说一说 Java 创建线程都有哪些方式?

这哥们心中窃喜,这个老生常谈的问题早已背的滚瓜烂熟,于是很流利的说了出来。

Java 创建线程有两种方式:

  1. 继承Thread类,并重写run()方法
  2. 实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread

面试官:(拿出一张白纸)那你把这两种方式写一下吧!

小哥:(这有何难!)好~

public static void main(String[] args) {
	// 第一种
    MyThread myThread = new MyThread();
    myThread.start();
	// 第二种
    new Thread(() -> System.out.println("自己实现的run-2")).start();
}

public static class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("自己实现的run-1");
    }
}

面试官:嗯,那除了这两种,还有其他创建线程的方法吗?

这些简单的问题难不倒这哥们,于是他想到了 Java5 之后的Executors,Executors工具类可以用来创建线程池。

小哥:Executors工具类是用来创建线程池的,这个线程池可以指定线程个数,也可以不指定,也可以指定定时器的线程池,它有如下常用的方法:

newFixedThreadPool(int nThreads):创建固定数量的线程池
newCachedThreadPool():创建缓存线程池
newSingleThreadExecutor():创建单个线程
newScheduledThreadPool(int corePoolSize):创建定时器线程池

面试官:嗯,OK,咱们还是针对你刚刚写的代码,我再问你个问题。

此时这哥们有种不祥的预感,是不是自己代码写的有点问题?或者要问我底层实现?

面试官:你写的两种创建线程的方式,都涉及到了run()方法,你了解过Thread里的run()方法具体是怎么实现的吗?

果然问到了源码了,这哥们之前看了点,所以不是很慌,回忆了一下,向面试官道来。

小哥:emm……Thread 中的run()方法里东西很少,就一个 if 判断:

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

有个target对象,会去判断该变量是否为空,非空的时候,去执行target对象中的run()方法,否则啥也不干。而这个target对象,就是我们说的Runnable:

/* What will be run. */
private Runnable target;

面试官:嗯,那这个Runnable类你了解过吗?
小哥:了解过,这个Runnable类很简单,就一个抽象方法:

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

这个抽象方法也是run()!如果我们使用Runnable接口,就需要实现这个run()方法。由于这个Runnable类上面标了@FunctionalInterface注解,所以可以使用函数式编程。

那小哥接着说:(突然自信起来了)所以这就对应了刚才说的两种创建线程的方式,假如我用第一种方式:继承了Thread类,然后重写了run()方法,那么它就不会去执行上面这个默认的run()方法了(即不会去判断target),会执行我重写的run()方法逻辑。

假如我是用的第二种方式:实现Runnable接口的方式,那么它会执行默认的run()方法,然后判断target不为空,再去执行我在Runnable接口中实现的run()方法。

面试官:OK,可以,我再问你个问题。

小哥:(暗自窃喜)

面试官:那如果我既继承了Thread类,同时我又实现了Runnable接口,比如这样,最后会打印什么信息出来呢?

面试官边说边拿起刚刚这小哥写的代码,对它进行了简单的修改:

public static void main(String[] args) {
    new Thread(() -> System.out.println("runnable run")) {
        @Override
        public void run() {
            System.out.println("Thread run");
        }
    }.start();
}

这小哥,突然有点懵,好像从来没想过这个问题,一时没有什么思路,于是回答了个:会打印 “Thread run” 吧……

面试官:答案是对的,但是为什么呢?

这小哥一时没想到原因,于是面试官让他回去可以思考思考,就继续下一个问题了。

亲爱的读者朋友,你们知道为什么吗?你们可以先思考一下。

其实这个答案很简单,我们来分析一下代码便知:其实是 new 了一个对象(子对象)继承了Thread对象(父对象),在子对象里重写了父类的run()方法;然后父对象里面扔了个Runnable进去,父对象中的run()方法就是最初那个带有 if 判断的run()方法。

好了,现在执行start()后,肯定先在子类中找run()方法,找到了,父类的run()方法自然就被干掉了,所以会打印出:Thread run。

如果我们现在假设子类中没有重写run()方法,那么必然要去父类找run()方法,父类的run()方法中就得判断是否有Runnable传进来,现在有一个,所以执行Runnable中的run()方法,那么就会打印:Runnable run 出来。

说白了,就是问了个 Java 语言本身的父子继承关系,会优先执行子类重写的方法而已,只是借这个场景,换了个提问的方式,面试者可能一时没反应过来,有点懵也是正常的,如果直接问,傻子都能回答的出来。

后记:通过这道简单的面试题,帮大家分析了一下在创建线程过程中的源码,可以看出来,面试过程中,面试官更加看重一些原理性的东西,而不是背一下方式就行了。同时也能看的出,面试大厂,需要做好充分的准备。另外,在面试的时候要冷静,可能有些问题并没有太难,回答不出来只是当时太紧张造成的。

 最后如何备战Java面试?

谈到怎么准备Java面试,我想说,若你还同无头苍蝇一般不知如何下手,那么第一件事你要做的就是梳理自身的知识脉络。毕竟,想要进大厂,就需要具备更多的知识树,需要掌握更全面的知识体系,所以就需要对知识进行一个系统的梳理了。

如果觉得自己手绘Java知识脉络图比较麻烦,可以借鉴参考下方我之前大致手绘一份知识网图(Java知识体系庞大,我是用的xmind绘制的脉络图,文中无法直接上传原件,截图如下,内容过多以至于图片不够清晰,但可提供分享原件☞☞☞原件下载 )。

​

此外,关于面试刷题,个人觉得这份 “Java高分面试指南”很不错,包含25个专题内容,整个1000+题50w+字解析,够你刷到秃顶:

  • Java中的IO与NIO
  • Java反射
  • Java序列化
  • Java注解
  • 多线程&并发
  • JVM
  • Mysql
  • Redis
  • ........

最后,还有2021最新整理的“Java中高级核心知识点解析”,查漏补缺知识点刷它最合适不过,包含整个30类知识点的集合:

  • JVM
  • JAVA集合
  • JAVA多线程并发
  • JAVA基础
  • Spring原理
  • 微服务
  • Netty与RPC
  • ....


从学习路线→☛面试刷题→☛核心知识补漏,以上全套的Java学习资源皆可免费共享给有需求的你,还请仔细关注一下免费下载原件的方式:

1:一键三连+评论此文(码字不易,一键三连是对此文的一个认可,也可让更多朋友阅读到)
2:加小姐姐VX:k15197783918

 

多线程执行指定名称方法 Java 利用Java的反射机制,提供一个根据方法名执行指定方法的方式。 立即下载

相关推荐

Apache Hop环境搭建实战:从零到一的下载、安装与配置指南

本文详细介绍了Apache Hop环境搭建的全过程,包括下载、安装与配置指南。从选择正确的JDK17版本到设置关键环境变量,再到启动GUI界面和解决常见问题,提供了全面的实战指导。适合数据工程师和ETL开发者快速上手这一强大的数据集成工具。

weixin_42634811的博客 574

Java【代码 10】线程池ThreadPoolExecutor指定线程执行任务(修改线程名称+线程任务指定)

本文介绍了如何在线程池中指定特定线程执行任务的方法。首先通过ThreadManager类创建线程池,配置核心线程数、最大线程数等参数。然后通过获取当前所有线程,重命名线程名称来实现线程标识。最后通过判断线程名称来指定特定线程执行相应任务,从而实现对线程任务的精确控制。这种方法适用于需要特定线程执行特定任务的并行处理场景。

Java与大数据相关实践内容分享! 4303

OpenManus本地部署实战:从源码编译到浏览器路径优化全解析

本文详细解析了OpenManus本地部署的全过程,从源码编译到浏览器路径优化。涵盖环境准备、源码获取、模型配置、依赖安装等关键步骤,特别针对Windows系统下的chrome.exe路径修改提供了实用解决方案,帮助开发者高效完成部署并优化性能。

weixin_28826545的博客 381

Java 指定线程执行顺序(三种方式)

面试:你懂什么是分布式系统吗?Redis分布式锁都不会?>>> ...

Viking的博客 895

爬取百度图片

最开始,我们想要爬取图片,首先需要打开百度图库,然后在搜索栏中输入自己想要的图片(比如说壁纸)。接着右键检查,点击网络:起初可能没有名称信息,刷新界面就可以了。打开信息,查看标头内容可以看到请求URL为:复制这串URL,然后在浏览器中打开这个就是我们搜索的壁纸图片的网页内容。怎么找到图片的URL呢?在上述内容中,找到data,可以发现里面每隔一个aiEditData,下面代码的形式是一样的,就相当于一张图片。

weixin_54143563的博客 1940

【CASS精品教程】035:南方CASS7.1台阶画法案例大全

摘要:本文详细介绍了南方CASS7.1软件中5种台阶工具的使用方法,包括普通台阶、有边台阶、L型台阶、U型台阶和不规则台阶。重点说明各类台阶的绘制步骤和注意事项,如绘制方向(从右下角逆时针连接4个点)、台阶方向标识(白色边为下边)、台阶数自动生成不可更改等特性。同时指出高版本CASS可能存在操作差异,并配以多张示意图直观展示各类台阶的绘制过程和效果,为使用CASS7.1绘制建筑台阶提供了实用指导。(148字)

智慧空间实验室 2921

java 指定线程运行_Java指定周期运行线程

使用Java的API可以指定周期地启动线程。设置从现在开始(从0秒开始),每隔10秒,启动一个线程ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);ses.scheduleAtFixedRate(new PeroidSchedualRunnable(), 0, 10, TimeUnit.SECONDS);运行的线程...

weixin_36259655的博客 699

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题5)-网络部分解析-附详细代码

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题5)-网络部分解析-附详细代码

bfq05234214的博客 416

java创建指定id线程_当阿里面试官问:Java创建线程有几种方式?我知道问题没那么简单...

昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的问题:你说一说 Java 创建线程都有哪些方式?这哥们心中窃喜,这个老生常谈的问题早已背得滚瓜烂熟,于是很流利的说了出来。Java 创建线程有两种方式:1.继承Thread类,并重写run()方法2.实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread面试官:(拿出一张白纸)那你把这两种方...

weixin_29041767的博客 205

cesium实战目录必看

本文作者长期从事GIS相关工作,专注于三维和地图可视化领域,熟悉Cesium、Three.js、WebGL等开发框架。文章目录展示了作者在Cesium应用中的多项技术实践,涵盖水面反射、离屏渲染、后处理效果、地形裁剪、Shader着色器、动态单体化、气象图、缓冲区域、坡度和坡向分析、三维热力图、通视分析、态势标绘等多个方面。这些内容为开发者提供了丰富的技术参考,展示了Cesium在三维可视化中的强大功能和应用场景。

God's asylum的博客 8718

第十二段:基于env的重用

现代芯片的验证通常分为两个层次, 一是模块级别( block level, 也称为IP级别、 unit级别) 验证, 二是芯片级别( 也称为SOC级别) 验证。 一个大的芯片在开发时, 是分成多个小的模块来开发的。 每个模块开发一套独立的验证环境, 通常每个模块有 一个专门的验证人员负责。 当在模块级别验证完成后, 需要做整个系统的验证。 假设某个系统分成了三个模块,如下图: 这三个模块在模块级别验证时, 分别有自己的driver和s...

年糕的博客 423

Java 自定义线程类

Java 自定义线程类

qq_45437885的博客 906

S7-200 SMART PLC 数字量阀门控制功能块(FB)汇总

S7-200 SMART PLC功能块的各种写法可以查看专栏的其它文章,链接地址如下:S7-200 SMART PLC 子程序功能块(阀门控制)_RXXW_Dor的博客-优快云博客_plc控制阀门开关程序由于S7-200 SMARTPLC的子程序种种功能、容量限制,有时想实现多次调用的子程序可能并不是太容易,这篇博客还是给出一些推荐写法,供大家参看。

RXXW_Dor的博客 3999

java 创建线程_阿里面试官问:Java创建线程有几种方式?我就知道问题没那么简单

昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的问题:你说一说 Java 创建线程都有哪些方式?这哥们心中窃喜,这个老生常谈的问题早已背的滚瓜烂熟,于是很流利的说了出来。Java 创建线程有两种方式:继承Thread类,并重写run()方法实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread面试官:(拿出一张白纸)那你把这两种方式写一下...

weixin_39622562的博客 68

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java 创建线程_当阿里面试官问我:Java创建线程有几种方式?我就知道问题没那么简单

这是最新的大厂面试系列,还原真实场景,提炼出知识点分享给大家。 昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的问题:你说一说 Java 创建线程都有哪些方式?这哥们心中窃喜,这个老生常谈的问题早已背的滚瓜烂熟,于是很流利的说了出来。Java 创建线程有两种方式:1. 继承Thread类,并重写run()方法2. 实现Runnable接口,覆盖接口中的run()方法,并把Runna...

weixin_39775428的博客 57

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java 创建线程_阿里面试官问:Java创建线程有几种方式?我就知道问题没那么简单...

这是最新的大厂面试系列,还原真实场景,提炼出知识点分享给大家。点赞再看,关注这个 Java 菜鸟。昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的问题:你说一说 Java 创建线程都有哪些方式?这哥们心中窃喜,这个老生常谈的问题早已背的滚瓜烂熟,于是很流利的说了出来。Java 创建线程有两种方式:继承Thread类,并重写run()方法实现Runnable接口,覆盖接口中的run()...

weixin_39733232的博客 67

当阿里面试官问我:Java创建线程有几种方式?我就知道问题没那么简单(转载)

昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的问题:你说一说 Java 创建线程都有哪些方式? 这哥们心中窃喜,这个老生常谈的问题早已背的滚瓜烂熟,于是很流利的说了出来。 Java 创建线程有两种方式: 继承Thread类,并重写run()方法 实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread 面试官:(拿出一张白纸)那你把这两种方式写一下吧! 小哥:(这有何难!)好~ public static void main(String[] ar

zhongqill的博客 178

面试被问项目上线没_阿里面试官问:Java创建线程有几种方式?我就知道问题没那么简单...

昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的问题:你说一说 Java 创建线程都有哪些方式?这哥们心中窃喜,这个老生常谈的问题早已背的滚瓜烂熟,于是很流利的说了出来。Java 创建线程有两种方式:继承Thread类,并重写run()方法实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread面试官:(拿出一张白纸)那你把这两种方式写一下...

weixin_33678821的博客 669

阿里的面试官都喜欢问哪些问题?

作者:徐刘根 | 公众号:Java之间 金九银十是招聘的旺季,小编在这里也给大家整理了一套阿里面试官最喜欢问的问题或者出场率较高的面试题,助校招或者社招路上的你一臂之力! 首先我们需要明白一个事实,招聘的一个很关键的因素是在给自己找未来的同事,同级别下要找比自己优秀的人,面试是一个双向选择的过程,也是一个将心比心去沟通的过程。 就像我们有的人感觉自己很牛逼,但是拿不到offer,...

徐刘根的博客 1万+

面试官:线程池有哪几种创建方式,能详细的说下么?

根据摩尔定律所说:集成电路上可容纳的晶体管数量每 18 个月翻一番,因此 CPU 上的晶体管数量会越来越多。 但随着时间的推移,集成电路上可容纳的晶体管数量已趋向饱和,摩尔定律也渐渐失效,因此多核 CPU 逐渐变为主流,与之相对应的多线程编程也开始变得普及和流行起来,这当然也是很久之前的事了,对于现在而言多线程编程已经成为程序员必备的职业技能了,那接下来我们就来盘一盘“线程池”这个多线程编程中最重要的话题。 什么是线程池? 线程池(ThreadPool)是一种基于池化思想管理和使用线程的机制。它是将多

AI乔治 8573

阿里面试官问我Java线程和操作系统线程什么关系

这个问题是安琪拉之前面试被问到的一个问题,正好顺着上一篇文章介绍完线程调用时的用户态和内核态的切换,后续把Java 并发的都一起讲了。 面试官:听前一个面试官说你Java并发这块掌握的不错,我们深入的交流一下; 我: 看了看面试官头部稀疏的结缔组织,已然觉得这场面试不简单,不过好在事前把安琪拉的博客看了个遍,有所准备,我回答说:咳咳,掌握的还算可以。 面试官:Java线程用过的吧? 我:用过。 面试官:那你给我讲讲Java线程和操作系统的? 我:啊!!! 剧情不应该这样的啊,开场不应该先是 sync.

安琪拉的博客 2675

面试官:线程池有几种创建方式?

核心是理解 “核心线程 → 队列 → 非核心线程 → 拒绝” 的执行流程,根据 CPU 密集型(N+1)或 IO 密集型(2N)合理配置线程数,选择有界队列和合适的拒绝策略。:如果你只会调用 API 创建,但不理解线程池的执行流程(核心线程 → 队列 → 非核心线程 → 拒绝)和 7 个核心参数的含义,说明只是 “会用” 而非 “懂原理”。:先用正式员工(核心线程),忙不过来就排队(队列),队列满了招临时工(非核心线程),实在不行就拒绝(拒绝策略)。如果是,则直接创建新的核心线程来执行任务,不需要排队。

犬小哈 444

面试官问你Java线程池--怎么样回答才能让面试官知道你真的懂了

设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

2401_83977580的博客 997
上一篇: 20年秋招(21届)复习指导+面经总结,手把手教你进大厂——阿里、网易、京东、多益等
下一篇: MYSQL中JOIN的用法
奇迹摘星w
博客等级 码龄6年 1844粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值