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线程池是怎么统计线程空闲时间?
背景介绍: 你刚从学校毕业后,到新公司实习,试用期又被毕业,然后你又不得不出来面试,好在面试的时候碰到个美女面试官! 面试官: 小伙子,我看你简历上写的项目中用到了线程池,你知道线程池是怎样实现复用线 ...
随机推荐
- #结论#洛谷 3199 [HNOI2009]最小圈
题目 求有向图最小平均权值回路. \(n\leq 3*10^3,m\leq 10^4\) 分析 设 \(f_k(x)\) 表示从点 \(x\) 出发恰好走 \(k\) 条边的最短路, 那么答案就是 \ ...
- 使用脚本整合指定文件/文件夹,执行定制化 ESLint 命令
背景 最近面对一个庞大的项目,但是只需要修改某个模块,每次都手搓命令太麻烦了,于是就想着能不能写个脚本来辅助处理这些事情. 解决方案 定制化一键 ESLint,执行文件下载地址: https://gi ...
- OpenHarmony 4.0 Beta1发布,邀您体验
初夏之际,OpenAtom OpenHarmony(简称"OpenHarmony") 4.0 Beta1版本如期而至.4.0 Beta1版本在3.2 Release版本基础上, ...
- C# 虚方法virtual详解(转载)
C# 虚方法virtual详解 在C++.Java等众多OOP语言里都可以看到virtual的身影,而C#作为一个完全面向对象的语言当然也不例外. 虚拟函数从C#的程序编译的角度来看,它和其它一般的函 ...
- MogDB/openGauss如何实现事务的rollback
MogDB/openGauss 如何实现事务的 rollback 本文出处:https://www.modb.pro/db/113262 数据库最主要的功能就是存储数据,然而我们在进行数据库操作时,却 ...
- HarmonyOS应用开发Web组件基本属性应用和事件
一.Web组件概述 Web组件用于在应用程序中显示Web页面内容,为开发者提供页面加载.页面交互.页面调试等能力. ● 页面加载:Web组件提供基础的前端页面加载的能力,包括加载网络页面.本地页面 ...
- HDC2021技术分论坛:ArkUI 3.0让多设备开发更简单!
作者:wanglei,华为UI编程框架技术专家 HarmonyOS自诞生以来,就是为满足分布式多设备应用场景而设计的,大到智慧屏.车机.平板,小到手机.手表.在多设备场景下进行应用UI界面开发,面临新 ...
- 实训篇-Html-计算器
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 通过ORPO技术微调 llama3大模型(Fine-tune Llama 3 with ORPO)
1f45bd1e8577af66a05f5e3fadb0b29 通过ORPO对llama进行微调 前言 ORPO是一种新颖的微调技术,它将传统的监督微调和偏好对齐阶段整合到一个过程中.这减少了训练所需 ...
- 力扣613(MySQL)-直线上的最近距离(简单)
题目: 表 point 保存了一些点在 x 轴上的坐标,这些坐标都是整数. 写一个查询语句,找到这些点中最近两个点之间的距离. 最近距离显然是 '1' ,是点 '-1' 和 '0' 之间的距离.所以输 ...