线程池任务执行出现异常,如何知道是哪个线程出了异常?

devtools/2024/9/24 20:26:31/
  • 自定义线程工厂类,去实现ThreadFactory的接口,为每个线程设定setUncaughtExceptionHandler,记录异常信息。

public class CustomThreadFactory implements ThreadFactory {

    @Override

    public Thread newThread(Runnable r) {

        Thread thread = new Thread(r);

        thread.setUncaughtExceptionHandler((t, e) -> {

            System.out.println("Thread " + t.getName() + " threw exception: " + e);

        });

        return thread;

    }

}

  • 线程池提交任务时,使用submit()方法,而不是execute(),这样可以通过Future对象捕获并检查任务执行的结果和异常

public class ThreadPoolWithFuture {

    public static void main(String[] args) {

        ExecutorService executor = Executors.newFixedThreadPool(5);

        Future<?> future = executor.submit(() -> {

            throw new RuntimeException("Exception in thread");

        });

        try {

            future.get(); // 可以获取报错

        } catch (InterruptedException | ExecutionException e) {

            System.out.println("Task threw exception: " + e.getCause());

        }

        executor.shutdown();

    }

}

  • 如果你的任务实现了Runable接口,就可以在run方法内部用try catch捕获

ExecutorService executor = Executors.newFixedThreadPool(10);

executor.submit(new Runnable() {

    @Override

    public void run() {

        try {

            // 你的业务逻辑

            riskyOperation();//可能出现异常的地方

        } catch (Exception e) {

            // 捕获并处理异常

            System.err.println("Caught an exception in the task: " + e.getMessage());

            // 可以记录日志、发送警报等

        }

    }

});

  • 任务执行过程中出现了异常,线程会怎样?
    • 会把线程移除销毁,然后创建一个新的线程来替换。

http://www.ppmy.cn/devtools/116654.html

相关文章

C++中类的创建和声明

目录 前言 一、类的概念 二、对象 前言 说实话&#xff0c;C和C语言有比较大的差别&#xff0c;在C语言中我们面向的是过程&#xff0c;即要怎么实现功能的过程&#xff0c;在C中&#xff0c;我们面向对象&#xff0c;将这些功能和函数封装起来&#xff0c;用到直接调用对象&…

嵌入式面试学习笔记(入门1)

目录 指针的大小问题 sizeof和strlen C语言分配内存的方式 数组&#xff08;的&#xff09;指针和指针&#xff08;的&#xff09;数组 union 指针的大小问题 指针对于不少新手而言是一道难关&#xff0c;但是不必恐惧于指针。他的本质其实就是一个地址。请冷静下来仔细思…

【大模型专栏—实战篇】从0到1带你QLoar微调

大模型专栏介绍 &#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文为大模型专栏子篇&#xff0c;大模型专栏将持续更新&#xff0c;主要讲解大模型从入门到实战打怪升级。如有兴趣&#xff0c;欢迎您的阅读。 &#x1f4…

Debezium日常分享系列之:将容器镜像移至 quay.io

Debezium日常分享系列之&#xff1a;将容器镜像移至 quay.io 在Debezium 3.0.0.Final发布之后&#xff0c;我们将不再向docker.io发布容器镜像更新。旧版本的Debezium 2.x和1.x镜像将继续保留在docker.io上&#xff1b;然而&#xff0c;所有未来的Debezium 2.7.x和3.x或更高版本…

python | huey,一个非常厉害的 任务调度 Python 库!

本文来源公众号“python”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;huey&#xff0c;一个非常厉害的 Python 库&#xff01; 大家好&#xff0c;今天为大家分享一个非常厉害的 Python 库 - huey。 Github地址&#xff1a;h…

图片切换示例2【JavaScript】

这段代码实现了一个简单的图片切换效果。当用户将鼠标悬停在不同的小缩略图上时&#xff0c;主显示框&#xff08;#box&#xff09;的背景图片会切换为相应的缩略图所代表的图片。 实现效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"…

project generator 简单使用(二)之 CLion 与 AC6

文章目录 1 AC6 之于 CLion2 配置 progen3 可执行文件 size 显示优化4 测试 1 AC6 之于 CLion 1&#xff09;在上一篇文章中&#xff0c;我们知道 project generator 通过其 “Write Once, Compile any Tool” &#xff08;跨工具&#xff09;的特性&#xff0c;可以让我们使用…

Vue3:$refs和$parent实现组件通信

在Vue3中&#xff0c;refs和refs和parent是用于组件间通信的重要机制 一.$refs 1.操作子组件数据 一旦获取到子组件的实例&#xff0c;父组件可以修改子组件暴露的变量值&#xff0c;实现父子组件间的直接数据交换。 2.批量处理子组件 $refs可以用于同时获取多个子组件的…