线程池中异常捕获

Java 捕获并处理线程异常:Thread线程异常捕获、ThreadPoolExecutor线程池异常捕获 Thread.UncaughtExceptionHandler捕获线程异常 ThreadPoolExecutor#afterExecute方法捕获线程池异常 以及两者实现的原理 阅读详情

1、execute方法,子线程中有异常会抛出异常;

 public static void main(String[] args) {
     ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 5, 1000, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
for (int i=0;i<10;i++) {
    threadPoolExecutor.execute(()->doTask("execute"));
    
}

 threadPoolExecutor.shutdown();

 }
 private static void doTask(String string)throws RuntimeException {
     String str = "ThreadName:"+ Thread.currentThread().getName()+"执行方式:"+string;
     System.out.println(str);
     List list = null;
     System.out.println(list.size());      

 }

2、submit方法,子线程中有异常不会抛出,需要使用future.get()方法获取异常信息;

public class ThreadPools {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 5, 1000, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
   for (int i=0;i<10;i++) {
       Future future =  threadPoolExecutor.submit(()->doTask("submit"));
       try {
           future.get();
       } catch (InterruptedException e) {
           e.printStackTrace();
       } catch (ExecutionException e) {
           e.printStackTrace();
       }
   }

    threadPoolExecutor.shutdown();

    }
    private static void doTask(String string)throws RuntimeException {
        String str = "ThreadName:"+ Thread.currentThread().getName()+"执行方式:"+string;
        System.out.println(str);
        List list = null;
        System.out.println(list.size());
       /* try {
            System.out.println(list.size());
        }catch (Exception e) {
            System.out.println(e.getMessage());
        }
*/

    }
}

但是如果子线程中异常在子线程中被捕获到没有抛出,future.get()方法不会获取到异常信息;

public class ThreadPools {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 5, 1000, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
   for (int i=0;i<10;i++) {
       Future future =  threadPoolExecutor.submit(()->doTask("submit"));
       try {
           future.get();
       } catch (InterruptedException e) {
           e.printStackTrace();
       } catch (ExecutionException e) {
           e.printStackTrace();
       }
   }

    threadPoolExecutor.shutdown();

    }
    private static void doTask(String string)throws RuntimeException {
        String str = "ThreadName:"+ Thread.currentThread().getName()+"执行方式:"+string;
        System.out.println(str);
        List list = null;
        
        try {
            System.out.println(list.size());
        }catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }
Java-捕获线程异常可以有哪些方式实现 如果使用ExecutorService执行任务,并且任务实现了Callable接口,那么可以通过Future.get()方法。如果任务抛出了异常,Future.get()会重新抛出这个异常,从而可以在调用线程中捕获它。每个线程都可以设置一个未捕获异常处理器,当线程中抛出未捕获的异常时,这个处理器就会被调。子线程可以在抛出异常时将异常放入共享变量或队列中,主线程可以轮询或等待这些结构中的异常。选择哪种方法取决于你的具体需求和你正在使用的并发模式。在许多情况下,将异常记录到日志中是最简单和最实用的方法。 阅读详情

相关推荐

Mac本地大模型实战指南:Ollama+Metal+Apple Silicon深度优化

大语言模型(LLM)本地化部署正成为开发者关键技术能力,其核心在于推理效率、硬件适配与成本控制。Apple Silicon凭借统一内存架构(UMA)和Neural Engine,为本地LLM运行提供了独特优势;Metal加速则显著提升GPU计算吞吐,使Gemma 4、Qwen 3.5等模型在M系列Mac上实现低延迟、高精度、离线可用的工程落地。相比云端API,本地方案规避了token计费、网络依赖与数据外泄风险,特别适用于企业文档处理、实时语音分析、私有知识库检索等强隐私、低时延场景。本文聚焦Mac平台,系

weixin_33443333的博客 352

如何获取线程池中的异常

1.若不需要处理返回值,则可以使用execute()方法来提交任务,当任务发生异常时,线程会抛出异常,同时我们也可以在run方法中捕获处理异常 2.若需要返回值,需要使用submit()方法时 (1)直接在run方法中捕获异常,包括未受检异常 (2)利用Future对象的get()方法,对该方法捕获异常,因为线程中出现的异常会抛给get()方法,简单来说,就是线程中出现了异常,就相当于get()方法出现了异常 (3)重写ThreadpoolExecutor的executor.afterExecute

m0_57713282的博客 3364

解锁RK3588视觉潜能:RGA硬件加速库实战指南

本文深入探讨了如何利用RK3588芯片内置的RGA硬件加速库,解决视觉应用中图像预处理的性能瓶颈。通过实战指南,详细介绍了RGA库在YUV转RGB、图像缩放等核心操作上的应用,相比CPU软处理可大幅降低延迟与CPU占用,从而充分释放RK3588的NPU算力,构建高效的AI视觉预处理流水线。

zeta9的博客 669

线程池异常捕获

捕获线程池的异常方法分为两种 1、一种是使用Thread和Runnable启动的线程使用UncaughtExceptionHandler 2、第二种是使用Callable和Future启动的现场,根据Future.get()捕获异常 第一种 首先创建一个线程运行类 package t...

chilian1180的博客 827

Gitlab+Jenkins+Docker+Harbor+K8s+Rancher集群搭建CICD平台

本文以诺依项目为例详细记录了Kubernetes集群的部署过程以及配套DevOps环境的搭建。主要内容包括:1) 配置8个节点的软硬件环境;2) 基础环境准备(网络、防火墙、Docker等);3) 三节点Kubernetes集群部署;4) GitLab代码仓库安装;5) Harbor私有镜像仓库搭建;6) Jenkins持续集成工具配置;7) 基于若依项目的CI/CD实践;8) Rancher集群管理工具部署。

hickman2023的博客 1202

python sci sci-hub 爬论文

sci-hub 爬虫 后续加入对于时间的排序,下载最新文献 参考: https://www.guanjihuan.com/archives/6846 https://blog.youkuaiyun.com/czh2637750821/article/details/115508922

weixin_42783619的博客 3542

【异常】捕获线程池执行任务时产生的异常

在编写程序时,我们为了充分利用多核CPU、加快接口响应速度,通常会使用线程池来处理请求,但线程池执行任务过程中难免会出现异常,导致请求失败。那如果我们想在任务发生异常后捕获异常,并做一些”善后“操作,该如何做呢?

Annancqxxx的博客 905

C#利用最小二乘法拟合任意次函数曲线

给出一组离散点,确定一个函数逼近原函数,插值是这样的一种手段。在实际中,数据不可避免的会有误差,插值函数会将这些误差也包括在内。因此,我们需要一种新的逼近原函数的手段: ①不要求过所有的点(可以消除误差影响);②尽可能表现数据的趋势,靠近这些点。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小 [1],其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达,具体可以查阅相关资料。最小二乘法(又称最小平方法)是一种数学技术。

qq_30725967的博客 3755

浅谈线程池异常捕获(识别线程池使用时的一些坑)

1、线程池使用,提交任务时: 使用submit提交子任务,一定要获取返回值Future,通过get方法获取可能出现的异常,并且可以进行捕获(推荐) 使用execute执行子任务,异常可以被抛出,但是主线程不能捕获子任务线程中的异常 使用submit提交子任务,只是提交,不获取返回值future,异常会被封装在子线程内部,不会抛出,主线程也无法捕获 2、构建线程池时,推荐使用Thr...

聚沙成塔 8218

SAP Fiori Launchpad 自定义层文本翻译实战:精准修正 Tile、Catalog 与 Group 标题

SAP Fiori 项目中,入口层(tile/catalog/group)的翻译问题常被忽视,但其直接影响用户体验。与前端i18n不同,这些文本属于平台配置数据,需通过ABAP标准翻译流程(SE63)处理。关键步骤包括:使用/UI2/FLC定位Text ID和Configuration ID,根据前缀区分Main/Property WD Config Key,在SE63中锁定WDY_CONF_USERT2表对象进行翻译。操作时需注意使用系统源语言环境,翻译完成后可能需要清理缓存。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 170

仅使用 Python 创建的 Web 应用程序(前端版本)第03章Streamlit-多页面

接下来,我们将解释多页面切换。Streamlit 没有“多页面”或“页面路由”等功能。另一方面,通过根据用户动作切换要执行的功能,可以使其看起来好像存在“多个页面”。注意:我认为它类似于 SinglePageApplication (SPA)。然而,根据 React、Vue 等中使用的 URL 路径来更改页面的路由很困难。还有一个用于获取查询参数的实验性 API,但如果您确实需要这种功能,我认为认真尝试编写 React 或 Vue 是个好主意。我们来看一个通过按下按钮来切换页面的示例,如下所示。

xianyinsuifeng的博客 1329

如何实现线程池中异常捕获

arduino代码解读复制代码。

2401_89221445的博客 521

华为OD机考双机位C卷 - 两个字符串间的最短路径(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 两个字符串间的最短路径(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 835

(九)线程池异常捕获

上一篇提到了使用ThreadFactory的UncaughtExceptionHandler去捕获线程池的错误,还有没有其他方法呢? 线程的异常捕获可以使用try catch,但是主线程 如何 捕获子线程的异常呢?当一个线程执行出错了,接下来是否还要执行呢? 1. try catch 在子线程执行的方法体里面加上 try catch ,try catch 可以捕获当前线程的抛出的异常。 但是try catch 无法捕获其他线程的错误。 demo: public class OtherException {

HaC 的博客 4588

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

自定义线程池如何捕获线程异常

最近写了个自定义的线程池,用于处理持续时间短、频次高的任务,逻辑上借鉴了CachedThreadPool,使用SynchronousQueue 作为任务的缓存队列,即实现没有任务进入队里,只要有空闲线程就执行任务。此外还自定义了拒接执行策略,由默认的异常拒绝执行,改为CallerRunsPolicy策略,并加了一行日志用作监控告警。 自定义线程池不是重点,本文的重点在线程池捕获异常的问题。 在实现该线程池的时候,笔者为其设置了一个ThreadFacotry,其中实现了UncaughtExceptionHan

lqadam的博客 1737

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

线程的异常捕获与线程池的异常捕获

线程的异常捕获与线程池的异常捕获

p15097962069的博客 89

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

使用线程池捕获线程异常

在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked exception处理掉。这一点是通过java.lang.Runnable.run()方法声明(因为此方法声明上没有throw exception部分)进行了约束。但是线程依然有可能抛出...

zsj777的专栏 2819

线程池中捕获线程执行异常

在项目中使用线程池时,使用了如下方式:ExecutorService dataUploadPool = Executors.newFixedThreadPool(writeThreadNum);dataUploadPool.execute(new Thread(task))但是这种方式下,主线程无法捕获子线程中的异常,也就无法在子线程出现异常时采取措施。如果换一个实现方式就可以捕获子线程异常,步骤如

apexlj的博客 5073

扩展线程池捕获线程异常

如何捕获线程池中的线程异常 简单案例 我们先看一个案例,实现Runnable接口,计算两个数的商 创建一个线程池,参数如下 提交任务到线程池,查看执行结果 执行结果 我们发现,我们代码中,提交了5个线程,但最终只打印了4个结果, 而且没有报何错误,很明显100/0的那个任务没有打印 100/0会报除零异常,但是显然这次没有报任何错误 改用execute()提交线程 为了获得线程报错信息,我们可以改用execute()提交线程 从这里的控制台,我们得到了部分的报错信息,但是我们只能知道异常是在

张三李四王五老六 323

线程池抛出异常 捕获不到怎么办

https://mp.weixin.qq.com/s/VfReAqovJwmn5IoadC_7ug,郎涯进行简单排版与补充在实际开发中,我们常常会用到线程池,但任务一旦提交到线程池之后,如果发生异常之后,怎么处理?怎么获取到异常信息?在了解这个问题之前,可以先看一下 线程池的源码解析,从源码中我们知道了线程池的提交方式:submit 和execute 的区别,接下来分别使用他们执行带有异常的任务!看结果是怎么样的!运行结果:可以看到:submit 不打印异常信息,而 execute 则会打印异常信息。

郎涯技术 1811

python ThreadPoolExecutor 线程池中的异常捕获问题

这里主要想介绍 python `concurrent.futuresthread.ThreadPoolExecutor` 线程池中的 worker 引发异常的时候,并不会直接向上抛起异常,而是需要主线程通过调用`concurrent.futures.Future.exception(timeout=None)` 方法主动获取 worker 的异常。

MLee 的博客 1万+

终极指南:ThreadPool线程池异常捕获与错误处理实战

你是否曾因线程池中隐藏的异常导致程序崩溃?是否在调试多线程错误时迷失方向?本文基于[ThreadPool.h](https://link.gitcode.com/i/590abdf6e22337eda4073f14c49d3aba)的C++11实现,通过3个核心场景、4种捕获策略和5个最佳实践,帮你彻底解决线程池异常处理难题。读完本文你将掌握:任务提交失败的预防机制、运行时异常的优雅捕获、以及跨线...

gitblog_00049的博客 845

【Java线程】线程池的拒绝策略、异常捕获

目录标题拒绝策略1、拒绝策略使用场景2、JDK内置拒绝策略3、自定义线程池创建方式4、自定义拒绝策略1.简单示例2.JAVA线程池自定义拒绝策略以及利用反射获取任务参数线程池异常处理1、run函数中的try catch是必须的2、其他异常捕获1.通过设置UncaughtExceptionHandler打印异常日志2.双层try catch嵌套(项目中的使用) 使用线程池之前,先思考下面几个问题: 该异步场景适合用线程还是线程池? 使用JAVA默认的线程池,还是自定义的线程池? 使用JAVA默认的拒绝策略,

qq_43783527的博客 4747

python捕捉线程异常_解决python ThreadPoolExecutor 线程池中的异常捕获问题

问题最近写了涉及线程池及线程的 python 脚本,运行过程中发现一个有趣的现象,线程池中的工作线程出现问题,引发了异常,但是主线程没有捕获异常,还在发现 BUG 之前一度以为线程池代码正常返回。先说重点这里主要想介绍 python concurrent.futuresthread.ThreadPoolExecutor 线程池中的 worker 引发异常的时候,并不会直接向上抛起异常,而是需要主线...

weixin_39738251的博客 1718
上一篇: flowable性能优化(持续更新中)
下一篇: List Stream常用方法总结
Commander_Officer
博客等级 码龄16年 38粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值