IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> web微信开发工具,CSS浮动实战 -> 正文阅读

[开发工具]web微信开发工具,CSS浮动实战

有些线程它活着,但它躺在池中碌碌无为;

有的线程它死了,于是它变成一道面试题。

这次的文章,要从一次阿里的面试说起。

我记得那天是周一,刚刚经历过周末过的放松,干劲十足的我正在键盘上疯狂的输出。这时,我的手机响了起来,拿起一看,是来自杭州的电话,心想这次是要给我推荐股票呢还是要让我贷款呢。我接起了电话,准备“调戏一番”。那边响起一个声音:“你好,请问是xxx吗?这边是杭州阿里巴巴,现在有时间进行电话面试吗?”。说实在的,听完这句话后,我感觉我已经身在杭州,干劲十足的在杭州的阿里的工位上"修福报"。但是我现在正在疯狂输出,没有时间,于是我说:“不好意思,现在没有时间,可以约在今天晚上8点钟吗?”.

晚上如约接到了电话。我们直奔主题,在你来我往中进行了友好的技术交流。具体的面试过程就不详述了,后面有机会整理一份面试分享。整个面试过程中,有这么一道题给我留下了深刻的印象:

一个线程池中的线程异常了,那么线程池会怎么处理这个线程?

需要说明一下,文中讨论的线程池都是Executors线程池。

对于Executors线程池我可以说是烂熟于心,因为工作中用的比较的多,阅读过其源码。也是我作为面试官时必问的几个范围之一,比如以下问题:

了解JDK Executors线程池吗?
知道JDK提供了哪些默认的实现吗?
看过阿里巴巴java开发手册吗?知道为啥不允许使用默认的实现吗?
你们没有用默认的吧?那来介绍一下你们自定义线程池的几个常用参数呗?
你这个几个参数的值是怎么得来的呀?算出来的?怎么算出来的?
线程池里面的任务是IO密集型的还是计算密集型的呢?
好,现在我们有一个自定义线程池了,来说一下你这个线程池的工作流程呗?
那你这个线程池满了怎么办呀?拒绝?咋拒绝?有哪些拒绝策略呢?
别紧张,随便说两个就行。

回到开始说的阿里巴巴java开发手册不允许使用默认实现,你回答说可能会引起OOM,那我们聊聊JVM吧

阿里巴巴java开发手册关于线程池创建的建议

这一系列关于线程池的连环炮,就是我作为面试官时必问的几个问题。别问为什么,因为我们的招聘JD上明确写了:熟悉多线程编程。而这些问题,我觉得是熟悉多线程编程的基础。这里我也不解答了,这种文章网上还是挺多的,可以去了解一下。

这块真的很重要,我也多次给我的小伙伴强调:

来吧,一起分析一波

好了现在回到阿里的面试官问我的这道面试题:

一个线程池中的线程异常了,那么线程池会怎么处理这个线程?
先说说我当时的回答,因为心里没底,我的回答很犹豫也很烂!如下:

我的回答总结起来三句话:

1.抛出堆栈异常?—这句话对了一半!
2.不影响其他线程任务?—这句话全对!
3.这个线程会被放回线程池?—这句话全错!


测试用例写起来

抛出堆栈异常为啥对了一半?

先让程序跑起来,我们用事实说话:

从执行结果我们看出

当执行方式是execute时,可以看到堆栈异常的输出。
当执行方式是submit时,堆栈异常没有输出。
那么我们怎么拿到submit执行方式的堆栈异常呢,看图说话:

所以,现在知道为什么回答:抛出堆栈异常只对了一半吧。
execute方法执行时,会抛出(打印)堆栈异常。
submit方法执行时,返回结果封装在future中,如果调用future.get()方法则必须进行异常捕获,从而可以抛出(打印)堆栈异常。
你以为这一部分写到这里就完事了?那不行啊,你心里没有一个疑问吗?为啥execute直接抛出异常,submit没有直接抛出异常呢?

源码之下无秘密:
当执行方式是executes时:
java.util.concurrent.ThreadPoolExecutor#runWorker中抛出了异常:

在_java.lang.ThreadGroup#uncaughtException_进行了异常处理:

这个uncaughtException是何许人也,看java doc上咋说的:

这个方法是JVM调用的,我们只需要指定我们想要的处理方式即可。
那我们怎么指定呢:

//直接new Thread()的时候
Thread t=newThread();
t.setUncaughtExceptionHandler(newThread.UncaughtExceptionHandler()
{publicvoiduncaughtException(Thread t, Throwable e){
//根据业务场景,做你想做的 }
});

//线程池的时候:
ExecutorService threadPool = Executors.newFixedThreadPool(1, thread -> {
Thread t =newThread(thread);
t.setUncaughtExceptionHandler((t1, e) ->
System.out.println(“根据业务场景,做你想做的:”+ e.getMessage()));returnt;}
);

当执行方式是submit时:

其本质也是调用了execute方法,所以它还是回到_java.util.concurrent.ThreadPoolExecutor#runWorker_方法:

向前,继续跟进去看看:

_java.util.concurrent.FutureTask#setException_干啥了啊,瞅一眼:

深呼吸,整理好思路,我们马上走向最终的真相:

好了,第一个议题【抛出堆栈异常为啥对了一半?】讨论完毕。在源码里面走了一趟,现在我们可以给出这一部分的满分答案了。


不影响其他线程任务,回答正确

这一部分我们直接上代码,运行起来看结果吧:

代码和运行结果是不会骗人的:
线程池中一个线程异常了后,不影响其他线程任务
大家注意线程名称这个细节:1,2,3,4,6。魔鬼都在细节里啊,这个点我下面会讲,先在这里把问题抛出来:我就纳闷了,怎么没有5啊?!


这个线程会被放回线程池为啥全错了?

我们去源码里面寻找答案:

让源码给出答案:

5号线程去哪里了?

new Worker()方法会告诉你:5去哪里了。

再配上这张由我这个灵魂画师亲自操刀画的图,一起食用,味道更佳:

现在知道为啥:我回答这个线程会被放回线程池为啥全错了吧。还附带送你一个线程名称变化的细节,不客气。


总结一下

当一个线程池里面的线程异常后:
当执行方式是execute时,可以看到堆栈异常的输出。
当执行方式是submit时,堆栈异常没有输出。但是调用Future.get()方法时,可以捕获到异常。
不会影响线程池里面其他线程的正常执行。
线程池会把这个线程移除掉,并创建一个新的线程放到线程池中。
不要背答案,要理解,要深入,上面说完后记得在问问面试官,需要我从源码的角度讲一讲吗?这逼装的,礼貌而不失风度。

最后

分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。

面试经验技巧篇

  • 经验技巧1 如何巧妙地回答面试官的问题
  • 经验技巧2 如何回答技术性的问题
  • 经验技巧3 如何回答非技术性问题
  • 经验技巧4 如何回答快速估算类问题
  • 经验技巧5 如何回答算法设计问题
  • 经验技巧6 如何回答系统设计题
  • 经验技巧7 如何解决求职中的时间冲突问题
  • 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
  • 经验技巧9 在被企业拒绝后是否可以再申请
  • 经验技巧10 如何应对自己不会回答的问题
  • 经验技巧11 如何应对面试官的“激将法”语言
  • 经验技巧12 如何处理与面试官持不同观点这个问题
  • 经验技巧13 什么是职场暗语

面试真题篇

  • 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
  • 真题详解2 某知名社交平台软件工程师笔试题
  • 真题详解3 某知名安全软件服务提供商软件工程师笔试题
  • 真题详解4 某知名互联网金融企业软件工程师笔试题
  • 真题详解5 某知名搜索引擎提供商软件工程师笔试题
  • 真题详解6 某初创公司软件工程师笔试题
  • 真题详解7 某知名游戏软件开发公司软件工程师笔试题
  • 真题详解8 某知名电子商务公司软件工程师笔试题
  • 真题详解9 某顶级生活消费类网站软件工程师笔试题
  • 真题详解10 某知名门户网站软件工程师笔试题
  • 真题详解11 某知名互联网金融企业软件工程师笔试题
  • 真题详解12 国内某知名网络设备提供商软件工程师笔试题
  • 真题详解13 国内某顶级手机制造商软件工程师笔试题
  • 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
  • 真题详解15 某著名社交类上市公司软件工程师笔试题
  • 真题详解16 某知名互联网公司软件工程师笔试题
  • 真题详解17 某知名网络安全公司校园招聘技术类笔试题
  • 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

需要这份文档的朋友可以点击蓝色传送门即可免费获取!

面试技巧整理

司校园招聘技术类笔试题

  • 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

[外链图片转存中…(img-mP9dSPIf-1627109551919)]

需要这份文档的朋友可以点击蓝色传送门即可免费获取!

面试技巧整理

整理不易,点个关注再走吧

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 11:52:50  更:2021-07-25 11:53:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/20 13:28:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码