线程池中线程抛异常

news/2025/2/25 11:37:59/文章来源:https://www.cnblogs.com/KL2016/p/18735872

java中的线程池是一个非常重要的多线程编程工具,它可以通过预先创建一组线程并维护着队列来管理并发很高的任务。在使用线程池时,开发人员可以使用两个主要的方法submit()和execute()提交任务。

线程池中submit()和execute()方法的区别主要体现在返回值、异常处理、任务类型支持以及任务处理方式等方面。‌

  1. ‌返回值‌:

    • ‌execute()方法‌:没有返回值。它主要用于提交不需要返回结果的Runnable任务‌
    • ‌submit()方法‌:可以提交Runnable或Callable任务,并返回一个Future对象。通过Future对象,可以获取任务的执行结果、判断任务是否完成、取消任务执行以及获取任务执行中抛出的异常‌
  2. ‌异常处理‌:

    • ‌execute()方法‌:如果任务执行过程中抛出未捕获的异常,异常会被传递给线程池的UncaughtExceptionHandler,开发者需要手动在任务内部捕获异常,否则异常会丢失‌
    • ‌submit()方法‌:如果任务执行过程中抛出异常,异常会被封装在Future对象中,调用Future.get()时会抛出ExecutionException。开发者可以通过Future.get()捕获并处理异常‌.
  3. ‌任务类型支持‌:

    • ‌execute()方法‌:只能接收Runnable类型的任务,Runnable任务没有返回值‌
    • ‌submit()方法‌:既可以接收Runnable任务,也可以接收Callable任务。Callable任务可以返回结果‌。
  4. 任务处理方式‌:

    • ‌execute()方法‌:提交的任务直接在调用线程(通常是主线程)中运行,适用于不需要返回结果且希望立即执行的场景‌
    • ‌submit()方法‌:提交的任务会被添加到阻塞队列中,由线程池中的工作线程处理。提交任务的线程可以继续执行其他任务,直到任务执行完毕并返回结果‌。

 

 

用伪代码模拟一下线程池抛异常的场景:


public class ThreadPoolException {
    public static void main(String[] args) {

        //创建一个线程池
        ExecutorService executorService= Executors.newFixedThreadPool(1);

        //当线程池抛出异常后 submit无提示,其他线程继续执行
        executorService.submit(new task());

        //当线程池抛出异常后 execute抛出异常,其他线程继续执行新任务
        executorService.execute(new task());
    }
}

//任务类
class task implements  Runnable{

    @Override
    public void run() {
        System.out.println("进入了task方法!!!");
        int i=1/0;

    }
}

运行结果:

submit()想要获取异常信息就必须使用get()方法!!


//当线程池抛出异常后 submit无提示,其他线程继续执行
Future<?> submit = executorService.submit(new task());
submit.get();


2. 如何获取和处理异常


方案一:使用 try -catch

public class ThreadPoolException {
    public static void main(String[] args) {
        
        //创建一个线程池
        ExecutorService executorService = Executors.newFixedThreadPool(1);

        //当线程池抛出异常后 submit无提示,其他线程继续执行
        executorService.submit(new task());

        //当线程池抛出异常后 execute抛出异常,其他线程继续执行新任务
        executorService.execute(new task());
    }
}
// 任务类
class task implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("进入了task方法!!!");
            int i = 1 / 0;
        } catch (Exception e) {
            System.out.println("使用了try -catch 捕获异常" + e);
        }
    }
}

 

打印结果:

 

可以看到 submit 和 execute都清晰易懂的捕获到了异常,可以知道我们的任务出现了问题,而不是消失的无影无踪。

 

方案二:使用Thread.setDefaultUncaughtExceptionHandler方法捕获异常

 

UncaughtExceptionHandler 是Thread类一个内部类,也是一个函数式接口。

内部的uncaughtException是一个处理线程内发生的异常的方法,参数为线程对象t和异常对象e。

 方案三:重写afterExecute进行异常处理

在excute的方法里面,可以通过重写afterExecute进行异常处理,但是注意! 这个也只适用于excute提交

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889487.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精通清单管理:解锁工作与生活的无限可能

清单管理工具是一种高效便捷的管理工具,它可以帮助个人或团队明确目标、聚焦优先事项、减少认知负荷,并提升工作的掌控感和成功率。以下是对清单管理工具的详细介绍清单管理工具是一种高效便捷的管理工具,它可以帮助个人或团队明确目标、聚焦优先事项、减少认知负荷,并提升…

EmEdit打开txt文本文件提示该文件包含空字符(00H)

前言全局说明一、说明 1.1 环境: Windows 11 家庭版 23H2 22631.3737 EmEditor Professional (64-bit) Version 21.3.0二、提示该文件包含空字符(00H)三、原因 可能是在不同的环境导致,比如linux下编辑后,又在 windows 下打开,就可能出现 或者 文本在导出时选择的编码当前系…

Deepseek深度求索教程:从入门到精通,免费获取清华大学新闻学院104页完整指南

在当今信息爆炸的时代,如何高效地获取和利用知识成为了每个人面临的挑战。Deepseek深度求索作为一款强大的信息检索工具,正逐渐成为学术界和专业人士的首选。为了帮助大家更好地掌握Deepseek的使用技巧,我们特别整理了最新版的《Deepseek深度求索教程:从入门到精通》,该教…

用python画一个太阳花

import turtle from turtle import * color(red,yellow) begin_fill() while True: forward(200) left(170) if abs(pos()) <1: break end_fill() done()

秦时明月6.2魔改版_搭建架设教程_附GM工具_安卓

本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!! 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了 一. 演示视频 https://githubs.xyz/show/50.mp4二. 环境 联网环境: centos7.6 , 放开所有端口 单机环境: VM虚拟机 …

YASKAWA机器人示教器维修

安川电机(YASKAWA)是全球知名的工业机器人制造商,其产品广泛应用于制造业、物流、医疗等多个领域。随着机器人使用的普及,维修服务变得越来越重要。在中国,安川电机设立了多个维修点,以提供及时的客户服务。 安川机器人示教器是用于控制和编程机器人的关键设备,它允许操…

浅谈李飞飞巴黎演讲:如果 AI 资源被少数公司垄断,整个生态系统都会完蛋

在巴黎人工智能峰会开幕式上,斯坦福大学教授、人工智能专家李飞飞发表了主题演讲,揭示了人工智能如何从“观察者”转变为重塑世界的“行动者”。她在致辞中,分析了“行动派”人工智能的意义,并呼吁各界共同努力,构建以人为中心的人工智能生态系统,以促进人工智能的健康发…

三、Pytest的简介

pytest是一个流行的测试框架,广泛用于单元测试、集成测试和功能测试。它具有简单、灵活、可扩展的特点,提供了丰富的功能和插件生态系统,它简化了测讨的编写和组织,pytest 通过提供丰富的功能和简洁的语法,让测试变得容易、灵活且易于理解。 1、安装 pip install pytest -…

面试官:你是如何进行SQL调优的?

SQL调优是我们后端开发人员面试中的高频考点,也是实际工作中提升数据库性能的关键技能。面对“你是如何进行SQL调优的?”这个问题,你是否能条理清晰地分析问题并提供解决方案? 1. 索引失效? 问题分析: 索引是提高查询速度的利器,但使用不当也会适得其反。常见的索引失效…

智御万击——香港直连DDOS高防服务器,为您的业务打造零干扰安全屏障

智御万击——香港直连DDOS高防服务器,为您的业务打造零干扰安全屏障 在数字化浪潮中,网络攻击正成为企业发展的隐形威胁。面对日益猖獗的DDoS攻击,您的业务是否仍暴露在风险中?香港直连高防服务器,以「智能清洗、零绕路、零断服」为核心,为企业筑起一道坚不可摧的安全防线…

No.4 HTML5--标签之段落 换行、水平线

主要内容:段落 p 换行 br 水平线 hr一、段落标签<p></p>1.快速打出<p></p>: 输入“p”,Tab键。 2.代码示例<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewpo…

2025年适用大中企业的CRM系统综合对比

在数字化转型的浪潮中,客户关系管理(CRM)系统已成为企业不可或缺的核心工具,特别是大中型企业的数字化转型已经开始步入深水区,随着市场竞争的日益激烈,大中型企业如何高效管理客户数据、优化销售流程、提升客户满意度,直接关系到其生存与发展。CRM系统作为企业关键基础…