Java线程的异常处理

Java多线程之线程的异常处理 在多线程编程中,异常处理是一个重要的话题。由于多线程程序具有一定的不确定性,因此在多线程环境下,异常处理的问题会更加复杂。 阅读详情

基本

线程对于异常的处理:

public class ExceptionInRunnableTest {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            int i = 3 / 0;
        });

        thread.start();
    }
}

运行上述代码:控制台输出如图。

当一个线程因为抛出异常,结束整个run方法时,结束整个thread生命周期时,JVM会在控制台打印异常信息。

当java的jar包跑在linux系统中时,就是会将异常信息输出到标准输出流里。

进阶

Thread有一个setUncaughtExceptionHandler方法,

可以改变线程结束抛出异常时JVM对应的动作。

public class ExceptionInRunnableTest {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            int i = 3 / 0;
        });
        thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                long id = Thread.currentThread().getId();
                System.out.println(id);
                System.out.println(e);
            }
        });
        thread.start();
    }
}

运行上述代码:控制台输出如图:

可以发现此时输出的就不再时JVM原本输出的异常栈信息,而是我们定制的信息。

如果此时我们的代码写的不好导致异常信息没有被正确的记录,那么整个异常信息就会直接被吞掉,无法知道发生了什么。只能知道这个线程”诡异”的结束了。

如果此时我们代码是使用日志框架记录了异常:log.error(xxxx,e); 那么异常信息就会进入我们的日志文件,而不是由JVM输出到标准输出。

线程池

事实上在真实的java应用中,我们几乎很少会单独起一个线程做什么事儿,都是启动一个线程池。

此时我们不会主动new Thread,也就没地方去设置setUncaughtExceptionHandler方法。

那么想定制异常信息输出到日志文件,jdk的线程池提供了类似的方法:java.util.concurrent.ThreadPoolExecutor#afterExecute。作用和线程的setUncaughtExceptionHandler方法类似。也是用来定制处理线程结束时的逻辑。

但是这里有一个有趣的容易踩到的坑。如下的代码:

public class ExceptionPoolTest {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(1);
        Future<?> submit = executor.submit(new Runnable() {
            @Override
            public void run() {
                int i = 1 / 0;
            }
        });
    }
}

运行后,不会输出任何异常信息。

为啥呢?因为我们在提交任务时,使用的subimit方法,这个方法是会返回Future结果的。所以一个线程就算是异常结束了,产生的异常也会被封装在Future里,只有在调用Future.get方法时才会抛出。

而上面的代码根本就不需要返回结果。所以也就没用到future。所以异常就感觉是莫名其妙的不见了。所以使用线程池时要注意。如果不打算返回任何结果,直接使用execute方法即可,不要使用submit。否则在生产环境找不到异常日志就难受了。

Java线程的异常处理机制 启动一个Java程序,本质上是运行某个Java类的main方法。我们写一个死循环程序,跑起来,然后运行 进行观察可以看到这个Java进程中,一共有11个线程,其中10个守护线程,1个用户线程。我们main方法中的代码,就跑在一个名为 的线程中。 当Java进程中跑着的所有线程都是守护线程时,JVM就会退出 。在单线程的场景下,如果代码运行到某个位置时抛出了异常,会看到控制台打印出异常的堆栈信息。但在多线程的场景下,子线程中发生的异常,不一定就能及时的将异常信息打印出来。我曾经在工作中遇到过一次,采用 阅读详情

相关推荐

Java多线程与异常处理详解

本文涵盖Java中学生考试成绩处理的异常机制,包括自定义RangeException和断言使用,并深入讲解多线程核心概念:线程状态、优先级、调度方式、Runnable接口应用及同步机制。通过实例演示sleep、join等方法的使用及其异常处理,帮助理解线程控制与协作。

u5v6w7的博客 1054

高开岗面:Java线程池中线程抛了异常,该如何处理?

1. 模拟线程池抛异常在实际开发中,我们常常会用到线程池,但任务一旦提交到线程池之后,如果发生异常之后,怎么处理?怎么获取到异常信息?在了解这个问题之前,可以先看一下 线程池的源码解析,从链接中我们知道了线程池的提交方式:submit和execute的区别,接下来分别使用他们执行带有异常的任务!看结果是怎么样的!我们先用伪代码模拟一下线程池抛异常的场景:publicclassThreadPoo...

Java精选 1860

Java线程的异常处理:确保线程安全运行

在上一期文章中,我们探讨了Java线程间的协作与竞争,详细介绍了wait()notify()和线程调度的机制。然而,实际的多线程开发中,一个更为常见的问题是如何在多线程环境下处理异常。线程执行过程中遇到的未处理异常可能会导致应用程序出现不可预期的行为,甚至崩溃。因此,理解Java线程中的异常处理机制是保障程序稳健运行的重要步骤。本期内容将深入探讨如何在Java中安全处理线程的异常情况,确保多线程程序的健壮性和可维护性。Java的多线程编程提供了强大的并发处理能力,但在此过程中处理异常往往容易被忽视。

喵手的博客 1314

Java线程池异常处理机制

前言 Thread t = new Thread(() -> System.out.println(1 / 0)); t.start(); 如果我们执行上面这段代码,会在控制台上看到异常输出。通常情况下绝大多数线上应用不会将控制台作为日志输出地址,而是另有日志输出。这种情况下,上面的代码所抛出异常便会丢失。那为了将异常输出到日志中,我们会这样写代码: hread t = new Thread(() -> { try { System.out.println(1 / 0); } cat

liuerchong的博客 3375

PostgreSQL14 离线安装全攻略:从下载到配置详解

本文详细介绍了PostgreSQL14在无网络环境下的离线安装全流程,涵盖RPM包与源码编译两种主流方法。文章重点解析了安装前的系统环境检查、依赖包准备、数据库初始化、远程访问配置以及安装后的关键检查与性能调优,旨在帮助运维和开发人员在离线服务器上高效、稳定地部署PostgreSQL14数据库。

p5l2m9n4o6q的博客 719

优化Cartographer重定位速度:从子图筛选到参数调优的完整思路

本文详细介绍了优化Cartographer重定位速度的完整方法,从子图筛选到参数调优,帮助工程师在已知初始位姿的前提下将重定位耗时降低50%以上。重点分析了性能瓶颈、子图筛选策略、匹配算法选择及环境自适应的参数优化策略,并通过实战案例展示了显著效果提升。

weixin_28704565的博客 464

Java线程池异常处理

Java线程池异常处理

moxiong3212的博客 1042

deepseek本地部署及应用部署指南

如果你找到的日志是[send] via NET/IB/0,则表示网络通信是通过IB网络的,但是没有开启GDRDMA技术,则会有大致5%的性能损耗(网传,未实测)。新增的环境变量配置,主要用于启用IB网络通信,而非使用以太网进行通信,详细的每一个参数的具体含义,可以在英伟达NCCL的官方网站上找到说明。下一步,我会对已经完成部署的模型进行压测,来探索系统的性能极限在哪里,以及如何在生产环境中何如进行进一步的性能优化,期待你的关注。

weixin_39797121的博客 2624

线程池异常如何处理?

忽的一下,想到了线程池的比较重要的一个参数:ThreadFactory接口,这个接口的作用是按需创建新线程的,使用线程工厂消除了对Thread#Thread(Runnable) new Thread的强依赖,使应用程序能够使用特殊的Thread子类、优先级等。大白话就是让线程池中的线程使用我们自定义的线程,这个自定义可不是我们通过execute()或submit()传进来的自定义线程,而是Worker类中的thread变量,也就是实际运行的线程,我们看一下Worker类的构造方法。

lucky_love816的博客 2824

ABAP ALV编辑后触发事件

1.FUNCTION ALV在it_events的参数中,写入对应的事件。2.OO ALV和FUNCTION ALV都可以,注册当前ALV的事件,对应的事件需要创建对象去实现。下面代码中,实现的是第一种,在it_events中写入事件。下面的代码是通过创建对象去实现ALV事件。

a86632678的博客 3852

硬件工程师学习-硬件的单元测试(UT)(1)电源与时钟的测试

我们在设计的时候,通过控制电源的上电使能管脚或者通过MOSFET、或者专用的电源上电控制芯片,控制不同电源的上电时序,以确保每个芯片的电源上电时序是满足芯片的要求的。我们在测试的时候,需要对相关的要求一一测试,以确认每个上电时序满足要求的。在维基百科中,相位噪声的定义是“时域不稳定性(抖动)导致波形在相位上发生快速、短期、随机的波动,这种波动在频域中的表现即为相位噪声”。单元测试,一般是指基于开发人员自行开展的功能测试及各个功能单元的单元测试,是硬件信号级的测试,分为基本测试和信号完整性测试。

qq_43416206的博客 4034

JAVA线程及线程池异常处理

JAVA线程异常处理 在run方法上增加异常处理 new Thread(() -&gt; { try { System.err.println(3 / 2); System.err.println(3 / 0); } catch (Exception e) { System.err.println("Catch exception===&gt;" + e.getMessage()); } ...

luoyoub的博客 2469

链接文件及功能安全:S32K3如何将FLASH驱动放到RAM里面、RAM如何实现软件复位数据不丢失操作。

在通过RTD的SDK也好MCAL也好,始终存在一个问题,生成的代码除了看门狗模块,默认都是放在flash里面,按照正常逻辑来看没啥大的问题,思考一个问题:Flash放在0x100的位置,但是此时我们要操作0x100怎么办?那肯定不允许啊,但是将flash的驱动放在RAM里面就可以避免这个问题的产生。Flash的特性:PF0能操作PF1,当然PF1也能操作PF0的,以此类推,只要不操作自身,想怎么玩都可以。这也是一个物理特性吧。

梦想技术家 2310

Java 线程异常处理

当多线程应用程序运行出现空指针异常,可以使用UncaughtExceptionHandler类进行捕捉,进而处理。 下面通过官方文档对UncaughtExceptionHandler进一步了解: 此类是Thread接口中的。 描述: 当线程由于未捕获的异常而即将终止时,Java虚拟机将查询线程的 UncaughtExceptionHandler使用情况 Thread.getUncaughtEx...

抛弃幻想,准备斗争 2197

AMBA-CHI协议详解(五)

 每个事务由许多不同的packets组成,这些数据包通过互连(interconnect)传输。packets内的一组ID域段用于提供有关包的附加信息。

Crazzy_M的博客 1963

科研神器: 用Gemini 3

Edge藏了个科研开挂神器!免TZ/免谷歌账号用Gemini 3,1分钟上手(附保姆级教程) 做科研查文献、理数据总卡壳?想蹭Gemini 3的AI能力,却被“谷歌账号+TZ+节点筛选”三连劝退? 现在不用折腾了!Edge浏览器里装个插件,直接把Gemini 3揣进口袋——**免翻墙、免谷歌账号、国内直接用**,分分钟让你的科研效率翻三倍,导师都得问你“偷偷开了啥挂”!

ZhangJiqun&191cm&85kg 1161

Java线程异常处理与多线程编程实践

Java线程未捕获异常处理通过Thread.UncaughtExceptionHandler接口实现,该接口定义了uncaughtException()方法用于处理线程抛出的异常。异常处理器可分为全局默认处理器和线程专属处理器两种绑定方式,JVM按特定优先级顺序处理未捕获异常。此外,Java线程分为守护线程和用户线程两类,守护线程的生命周期依赖于用户线程,当JVM仅剩守护线程时会直接终止程序。多线程环境下共享资源的访问需要通过同步机制(如synchronized)来解决竞态条件问题,确保数据一致性。 (字数

静水深流 1136

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java线程异常_java线程异常处理方法

工作中常发现有些程序发生异常但却没有错误日志,原因就是一些开发线程异常处理错误,导致程序报错但异常信息打印到堆栈上,不好在生产环境中定位问题。在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked exception处理掉。这一点是通过java.lang.R...

weixin_42360733的博客 1943

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

浅谈Java线程组 重点——线程群组异常处理

最近一段时间,看了看java的线程组,对于java线程组的基本操作有了一些掌握,特来分享给大家。 言归正传,传说中,啊不对,每一个线程都属于一个线程群组,在main方法里面写入的一个线程,那么他的就属于main的线程群组,来段代码看看。 使用图中的方法就能得到这个线程所属的线程群组。 之后还是看重点,线程群组是怎样来处理异常的。我不是很喜欢先知道流程或者是概念,先来个引例吧,我现在要做一个线程群...

qq_43073128的博客 746

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java多线程异常处理

Java多线程异常捕获

ybobob_的博客 1146

Java 线程 UncaughtExceptionHandler 异常处理机制

先看一个例子: public static void main(String[] args) { try { new Thread(() -> { int i = 1/0; }).start(); }catch (Throwable e){ System.out.println("error..."); } } 输出结果: Exception

【欢迎关注公众号:冬瓜白】 4262

java线程/线程池异常处理机制

JAVA中线程和线程池异常处理问题

文若书生的专栏 2092

Java线程池任务异常处理机制剖析

) r;// 如果任务正常完成,get()会立即返回t = ce;if (t!= null) {// 实际项目中这里应该使用日志框架System.err.println("线程池任务执行失败: " + t.getMessage());// 可以添加监控上报、告警等逻辑线程池的异常处理机制看似简单,实则暗藏玄机。通过本文的源码分析和实战演示,我们已经对Java线程池的异常处理有了更深入的理解。

江夏、的博客 564

【转载】Java线程池异常处理机制

多线程异常处理

代码的深渊 1016
上一篇: kafka broker关键参数配置
下一篇: Docker pull 拉不到镜像的简单解决方法
大飞Tobi
博客等级 码龄16年 54粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值