Java面试题:线程池内“闹情绪”的线程,怎么办?
在Java中,线程池中工作线程出现异常的时候,默认会把异常往外抛,同时这个工作线程会因为异常而销毁,我们需要自己去处理对应的异常,异常处理的方法有几种:
在传递的任务中去处理异常,对于每个提交到线程池中的执行的任务,可以提前通过异常进行捕获,这样即便出现了异常,也不会影响线程池中的工作线程
使用Future来捕获异常结果,在线程池中提供了一个submit(Callable<T>)方法,这个方法会返回一个Future,可以通过调用Future.get()方法,来获取任务的执行结果,如果任务执行过程中出现了异常,也会抛出一个ExecutionException,其中就包含了任务执行过程中出现的异常
我们还可以自定义一个ThreadFactory,设置一个UncaughtExceptionHandler,我们可以通过实现ThreadFactory的接口来自定义创建线程的方式,然后为每个新创建的线程设置一个UncaughtExceptionHandler,这个处理器会在线程由于未捕获异常而即将终止的时候被调用
下面是三段代码示例:
捕获线程执行异常
ExecutorService executorService = Executors.newFixedThreadPool(5);
executorService.execute(() -> {
try {
// 执行任务
} catch (Exception e) {
// 记录日志
logger.error("An exception occurred: ", e);
}
});
在执行任务的过程中,如果出现异常,就会被try-catch语句捕获,并将异常信息记录到日志中。
使用Future来捕获异常结果
ExecutorService executorService = Executors.newFixedThreadPool(5); List<Future<?>> futures = new ArrayList<>(); // 提交任务到线程池
for (int i = 0; i < 10; i++) {
Future<?> future = executorService.submit(() -> {
// 执行任务
});
futures.add(future);
} // 获取任务结果
for (Future<?> future : futures) {
try {
future.get();
} catch (InterruptedException | ExecutionException e) {
// 处理异常
logger.error("An exception occurred: ", e);
}
}
在这个例子中,我们将多个任务提交到线程池,并将每个任务的Future对象保存在futures列表中。接着,我们遍历futures列表,并调用每个Future对象的get()方法来获取任务的执行结果。如果任务执行过程中出现了异常,则会抛出ExecutionException异常,我们在catch块中捕获该异常并进行相应的处理。
实现UncaughtExceptionHandler接口
public class CustomExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
// 记录日志或者进行其它处理
logger.error("Thread " + t.getName() + " encountered an exception: ", e);
}
}
ExecutorService executorService = Executors.newFixedThreadPool(5);
// 设置UncaughtExceptionHandler
((ThreadPoolExecutor) executorService).setThreadFactory(r -> {
Thread thread = new Thread(r);
thread.setUncaughtExceptionHandler(new CustomExceptionHandler());
return thread;
});
executorService.execute(() -> {
// 执行任务
});
这种方式需要自定义一个实现了UncaughtExceptionHandler接口的异常处理器,当线程出现异常时,异常处理器会被调用,我们可以在其中记录日志或者进行其它处理。接着,我们需要将异常处理器设置到线程池的线程工厂中。当线程池内的线程出现异常时,异常处理器就会被调用,我们可以在其中处理异常。
Java面试题:线程池内“闹情绪”的线程,怎么办?的更多相关文章
- 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析
winform应用在使用一段时间后,切换到其他系统或者打开word.excel文档,再切换回winform应用时,系统有时出现不响应的现象.有时在锁屏后恢复桌面及应用时也发生此问题. 经微软支持确认, ...
- 一天十道Java面试题----第三天(对线程安全的理解------>线程池中阻塞队列的作用)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 21.对线程安全的理解 22.Thread和Runnable的区别 23.说说你对守护线程的理解 24.ThreadLoc ...
- Java 面试题 三 <JavaWeb应用调优线程池 JVM原理及调优>
1.Java Web应用调优线程池 不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文由浅入深,介 ...
- Java线程池中的核心线程是如何被重复利用的?
真的!讲得太清楚了!https://blog.csdn.net/MingHuang2017/article/details/79571529 真的是解惑了 本文所说的"核心线程". ...
- java多线程系类:JUC线程池:05之线程池原理(四)(转)
概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...
- java多线程系类:JUC线程池:03之线程池原理(二)(转)
概要 在前面一章"Java多线程系列--"JUC线程池"02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包 ...
- java多线程系类:JUC线程池:02之线程池原理(一)
在上一章"Java多线程系列--"JUC线程池"01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我 ...
- java多线程、线程池及Spring配置线程池详解
1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源.2.java中简单的实现多线程的方式 继承Thread ...
- java线程池及创建多少线程合适
java线程池 1.以下是ThreadPoolExecutor参数完备构造方法: public ThreadPoolExecutor(int corePoolSize,int maximumPoolS ...
- 面试官不按套路,竟然问我Java线程池是怎么统计线程空闲时间?
背景介绍: 你刚从学校毕业后,到新公司实习,试用期又被毕业,然后你又不得不出来面试,好在面试的时候碰到个美女面试官! 面试官: 小伙子,我看你简历上写的项目中用到了线程池,你知道线程池是怎样实现复用线 ...
随机推荐
- 闲来无事-esp32cam实现延时摄影
扯淡时间 在上一篇文章中我提了一嘴,打算使用esp32cam实现一个延迟摄影,奈何存在各种硬件问题,商家发了好几个地板都不好使(就是那个拼多多商家的问题,还说我供电不稳,我特意买了独立供电的hub), ...
- Go~开发笔记~目录
Go(又称为Golang)是一门由Google开发的开源编程语言,于2009年首次公开发布.Go语言被设计用来提高软件开发的效率和可靠性,在处理大规模系统时表现出色.以下是Go语言的一些特点和优势: ...
- #并查集,树状数组#洛谷 5610 [Ynoi2013] 大学
题目 分析 设最大值为 \(mx\),考虑每个数最多被除以 \(\log{mx}\) 次,那么加上树状数组的维护为 \(O(n\log{n}\log{mx})\) 问题就是如何快速找到这些位置,可以对 ...
- CSP-S2021江西自评分数(10-26)
娱乐性质,不负责任 在机房大佬的努力下,评测完了 总表 姓名 编号 总分 airport bracket palin traffic JX-00001 JX-00001 0 0 0 0 0 JX-00 ...
- 震撼!这个Python模块竟然能自动修复代码!
说到Python的强大的地方,那真的是太多了,优雅.简洁.丰富且强大的第三方库.开发速度快,社区活跃度高等,所以才使得Python才会如此的受欢迎. 今天给大家介绍一个特别暴力的Python库: Fu ...
- C#中yield return的作用
C#中yield return的作用 yield return作用在 return 时,保存当前函数的状态,下次调用时继续从当前位置处理.示例说明如下代码所示,主函数使用 foreach 输出 Get ...
- centos环境minio安装踩坑指南2023年7月30日
MinIO的安装踩坑指南 环境centos7 1. 安装MinIO官方文档 Binary下载 , 按照官网的路径配置比较快 下载minio wget https://dl.min.io/server/ ...
- centos8 \CentOS 9 Stream \Oracle Linux8\Oracle Linux 9 rpm 安装mysql8.0.28 mysql8.0.34
centos8 rpm 安装mysql8.0.28 检查 检测系统是否自带安装 MySQL 命令如下: rpm -qa | grep mysql 如果如下存在已安装的包,就需要卸载 mysql80-c ...
- Gowin 1nr-9k mipi测试
本次实验是利用gowin 1nr-9k的开发板测试MIPI屏. 测试的屏是2.0寸的,接口如下: 接上IO就是RST和MIPI的时钟和数据接口,另外就是电源和地. Gowin的案例中,首先是软件要升级 ...
- ASP.NET MVC5.0 筑基到炼气大圆满一篇就搞定
一.ASP.NET MVC 过滤器 ASP.NET MVC框架支持四种不同类型的过滤器: 授权过滤器 - 实现IAuthorizationFilter属性. 动作过滤器 - 实现IActionFilt ...