Java多线程异常处理

news2025/1/16 6:37:41

文章目录

  • 一. 线程中出现异常的处理
    • 1. 线程出现异常的默认行为
    • 2. setUncaoughtExceptionHandler()方法处理异常
    • 3. setDefaultUncaoughtExceptionHandler()方法进行异常处理
  • 二. 线程组内出现异常

一. 线程中出现异常的处理

1. 线程出现异常的默认行为

当单线程中初出现异常时,我们可在该线程run()方法的catch语句中进行处理,当有多个线程中出现异常时,我们就得在每个线程run()方法的catch语句中进行处理,这样会造成代码严重冗余。我们可以使用setDefaultUncaoughtExceptionHandler()和方法setUncaughtExceptionHandler()方法来集中处理线程的异常。

public class Main{
    public static void main(String[] args) {
        MyThread t=new MyThread();
        t.start();
    }
}
class  MyThread extends Thread{
   @Override
    public void run(){ 
      String username=null;
       System.out.println(username.hashCode());
   }
}

在这里插入图片描述
如上面的程序,程序运行后,控制台输出空指针异常。在java的多线程技术中,我们可以对多线程中的异常进行捕获,使用的是UncaughtExceptionHandler接口。从而对异常进行有效处理。当线程出现异常而终止时,JVM虚拟机捕获到此情况,并自动调用UncaughtExceptionHandler接口中的void uncaughtException(Thread t,Throwable e)方法来处理异常,使对多个线程的异常处理更集中。

2. setUncaoughtExceptionHandler()方法处理异常

public class Main{
    public static void main(String[] args) {
        MyThread t=new MyThread();
        t.setName("线程t");
        t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("线程:"+t.getName()+"出现了异常");
            }
        });
        t.start();
        MyThread t2=new MyThread();
        t2.setName("线程t2");
        t2.start();
    }
}
class  MyThread extends Thread{
   @Override
    public void run(){
      String username=null;
       System.out.println(username.hashCode());
   }
}

setUncaughtExceptionHandler方法的作用是对指定的线程对象设置默认的异常处理器。在Thread类中,我们还可以使用setDefaultUncaoughtExceptionHandler方法对所有的线程设置异常处理器

3. setDefaultUncaoughtExceptionHandler()方法进行异常处理

public class Main{
    public static void main(String[] args) {
        MyThread t=new MyThread();
        t.setName("线程t");
        MyThread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("线程:"+t.getName()+"出现了异常");
                e.printStackTrace();
            }
        });
        t.start();
        MyThread t2=new MyThread();
        t2.setName("线程t2");
        t2.start();
    }
}
class  MyThread extends Thread{
   @Override
    public void run(){
      String username=null;
       System.out.println(username.hashCode());
   }
}

在这里插入图片描述

可以对所有的线程都生效了

二. 线程组内出现异常

Java中的线程组(ThreadGroup)用于将一组线程组织在一起,并提供一些管理和操作的功能。然而,线程组在现代的Java编程中已经不常使用,并且在Java 9中已被标记为过时(deprecated)。尽管如此,我们可以描述一下线程组可能出现的异常情况和行为。以下是一些可能与线程组相关的异常:

  • IllegalThreadStateException(非法线程状态异常):当尝试将一个线程添加到已经销毁的线程组或一个线程组已经被终止时,可能会抛出此异常。

  • SecurityException(安全异常):在某些安全受限的环境中,如果没有足够的权限创建或修改线程组,可能会抛出此异常。

  • NullPointerException(空指针异常):在某些情况下,尝试对一个空的线程组对象进行操作(如添加线程、设置线程组名称等)可能会导致此异常。

需要注意的是,由于线程组在现代Java编程中已经不常用,因此在实际开发中可能很少会遇到与线程组相关的异常。为了更好地管理和组织线程,推荐使用更高级别的并发工具,如线程池(ThreadPoolExecutor)和并发集合(ConcurrentHashMap、ConcurrentLinkedQueue等)。

public class Main{
    public static void main(String[] args) {
        ThreadGroup group=new ThreadGroup("线程组");
        MyThread[] myThreads=new MyThread[10];
        for (int i = 0; i < myThreads.length; i++) {
            myThreads[i]=new MyThread(group,"线程"+(i+1),"1");
            myThreads[i].start();
        }
        MyThread newT=new MyThread(group,"报错线程","aasdfsdf");
        newT.start();
    }
}
class  MyThread extends Thread{
    private String num;
    public MyThread(ThreadGroup group,String name,String num){
        super(group,name);
        this.num=num;
    }
   @Override
    public void run(){
      int minINt=Integer.parseInt(num);
      while(true){
          System.out.println("死循环中:"+Thread.currentThread().getName());
          try {
              Thread.sleep(1000);
          } catch (InterruptedException e) {
              throw new RuntimeException(e);
          }
      }
   }
}

在这里插入图片描述

程序运行后其中一个线程出现了异常,而其它线程一直以死循环的方式持续打印结果。从运行结果来看,默认情况下线程组中的一个线程出现异常后不会影响其他线程的运行。见下面代码:

public class Main{
    public static void main(String[] args) {
        MyThreadGroup group=new MyThreadGroup("线程组");
        MyThread[] myThreads=new MyThread[10];
        for (int i = 0; i < myThreads.length; i++) {
            myThreads[i]=new MyThread(group,"线程"+(i+1),"1");
            myThreads[i].start();
        }
        MyThread newT=new MyThread(group,"报错线程","aasdfsdf");
        newT.start();
    }
}
class  MyThread extends Thread{
    private String num;
    public MyThread(ThreadGroup group,String name,String num){
        super(group,name);
        this.num=num;
    }
   @Override
    public void run(){
      int minINt=Integer.parseInt(num);
      while(this.isInterrupted()==false){
          System.out.println("死循环中:"+Thread.currentThread().getName());
      }
   }
}
class MyThreadGroup extends ThreadGroup{
    public MyThreadGroup(String name){
        super(name);
    }
    @Override
    public void uncaughtException(Thread t,Throwable e){
        super.uncaughtException(t,e);
        this.interrupt();
    }
}

在这里插入图片描述

可见发现所有的线程都停止了。这里使用自定义的线程组,并重写了uncaughtException,当线程出现异常时调用interrupt方法,终止所有线程。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业缺陷检测数据及代码(附代码)

介绍 目前,基于机器视觉的表面缺陷检测设备已广泛取代人工视觉检测,在包括3C、汽车、家电、机械制造、半导体与电子、化工、制药、航空航天、轻工等多个行业领域得到应用。传统的基于机器视觉的表面缺陷检测方法通常采用常规图像处理算法或人工设计的特征加分类器。一般而言…

【Tomcat下载及使用说明】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1.什么是Tomcat 2.Tomcat下载流程及注意问题 …

Eclipse将代码收缩if/for/try,支持自定义区域收缩

Hi, I’m Shendi Eclipse将代码收缩if/for/try&#xff0c;支持自定义区域收缩 最近忙于给网站增加功能&#xff0c;在使用 Eclipse 编写 Java 代码时发现一个函数内代码过多&#xff0c;并且 if&#xff0c;for&#xff0c;try这种代码块无法收缩&#xff08;在IDEA&#xff0…

【快速入门-简单实现】使用Java实现的单播、组播和广播

说明 TCP是一个面向连接的协议&#xff0c;TCP一定是点对点的,一点是两个主机来建立连接的&#xff0c;基于TCP实现的肯定是单播(但单播还可以使用UDP协议实现)。只有UDP才会使用广播和组播。 Java中的单播、组播和广播可以使用TCP或UDP协议来实现&#xff0c;具体取决于应用程…

【C语言】实现猜数字游戏——随机数

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 该篇将对 选择与循环语句 进行运用&#xff0c;实现猜数字游戏。 需求&#xff1a;游戏后可以选择再次进行游戏&#xff0c;也可以选择…

【Java-Crawler】HttpClient+Jsoup实现简单爬虫

Java编写网络爬虫 网络爬虫1. 爬虫入门程序 网络爬虫1. 网络爬虫的介绍2. 为什么学习网络爬虫 HttpClient1. Get请求2. 带参数的GET请求3. Post请求4. 带参数的 Post 请求5. 连接池6. 请求参数 Jsoup1. jsoup 介绍2.1 功能1.1-解析url2.2 功能1.2-解析字符串2.3 功能1.3-解析文…

由浅入深Dubbo核心源码剖析环境介绍

目录 1 框架介绍1.1 概述1.2 运行架构1.3 整体设计 2 环境搭建2.1 源码拉取2.2 源码结构2.3 环境导入2.4 测试2.5 管理控制台 1 框架介绍 1.1 概述 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架&#xff0c;使得应用可通过高性能的 RPC 实现服务的输出和输入功能&#…

ARM学习笔记_1 模式,寄存器,流水线

ARM arm体积小功耗低性能高&#xff0c;支持thumb ARM双指令集&#xff0c;兼容8/16位器件&#xff1b;大量使用寄存器&#xff0c;指令定长&#xff0c;寻址简单。 ARM是32位架构&#xff0c;Word 32bit&#xff0c; half Word 16bit. 模式 用户模式是用户程序的模式&#…

解决MySQL无法输入中文字符的问题

文章目录 问题描述问题排查解决方案1️⃣创建数据库时设置字符集为utf82️⃣修改数据库配置文件【比较麻烦】 写在最后 前几日在使用MySQL数据库的时候&#xff0c;出现了一处保存&#xff0c;故作此记录✍ 问题描述 下面是我这样exam表的结构 mysql> desc exam; --------…

PETR 论文学习

1. 解决了什么问题&#xff1f; DETR3D 为端到端的 3D 目标检测提供了一个思路。但是&#xff0c;DETR3D 中的 2D 到 3D 的变换会带来一些问题。 Reference point 的预测坐标可能不够准确&#xff0c;采样特征可能位于目标区域之外&#xff1b;只有映射点周围的特征会被选取&…

“超越极限 - 如何使用 Netty 高效处理大型数据?“ - 掌握 Netty 技巧,轻松应对海量数据处理!

1 写大型数据 因为网络饱和的可能性&#xff0c;如何在异步框架中高效地写大块的数据是特殊问题。由于写操作是非阻塞的&#xff0c;所以即使没有写出所有的数据&#xff0c;写操作也会在完成时返回并通知 ChannelFuture。当这种情况发生时&#xff0c;如果仍然不停地写入&…

2023年最受欢迎的低代码平台排行榜

随着企业寻找在降低成本的同时加快软件开发的方法&#xff0c;低代码开发平台正变得越来越受欢迎。这些平台允许开发人员使用拖放界面和预置组件&#xff0c;以最少的代码创建复杂的应用程序。它不仅帮助企业加快了数字化转型的脚步&#xff0c;而且打破业务部门和IT部门之间的…

多元分类预测 | Matlab萤火虫算法(FA)优化BP神经网络分类预测,FA-BP分类预测,多特征输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab萤火虫算法(FA)优化BP神经网络分类预测,FA-BP分类预测,多特征输入模型,多特征输入模型,多特征输入模型,多特征输入模型,多特征输入模型,多特征输入模型 多特征输入单输出的二分类及多…

商品领域十二张基础表设计思路与实现

欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章&#xff0c;主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等&#xff0c;同时欢迎大家加我微信「java_front」一起交流学习 1 文章概述 商品在电商领域中是一个非常重要的领域&#xff0c;交易行为前提是有…

Selenium + Java 的环境搭建

Selenium Java 的环境搭建 &#x1f50e;Chrome 浏览器下载 Chrome 浏览器检查对应版本下载 Chrome 浏览器驱动 &#x1f50e;配置环境变量&#x1f50e;验证环境是否搭建成功&#x1f50e;关于 pom.xml 出现错误的解决方案 &#x1f50e;Chrome 浏览器 下载 Chrome 浏览器 下…

使用命令启动默认程序(例如启动系统默认浏览器打开指定网址)

文章目录 目的基础说明代码示例&#xff08;Golang&#xff09;总结 目的 通过命令调用系统默认应用程序打开对应格式的文件是比较常用的功能。这篇文章将介绍下相关内容。 基础说明 Windows windows下可以使用 start 指令来启动默认程序打开对应格式文件&#xff1b; 比如 …

iptables中SNAT、DNAT及iptables服务启动时会自动还原规则

目录 SNAT原理与应用​编辑 SNAT转换前提条件 临时打开&#xff1a; 永久打开&#xff1a; 示例​编辑 DNAT原理与应用​编辑 DNAT转换前提条件 示例​编辑 防火墙规则的备份和还原 导出&#xff08;备份&#xff09;所有表的规则 清空规则​编辑 导入&#xff08;还…

【VMware】Ubunt 20.04时间设置

文章目录 设置本地时间 UTC8设置24小时制同步网络时间参考 Talk is cheap, show me the code. 设置本地时间 UTC8 查看当前时区状态 rootnode1:~/k8s# timedatectlLocal time: Sun 2023-05-21 15:24:02 CSTUniversal time: Sun 2023-05-21 07:24:02 UTCRTC time: Sun 2023-05-2…

计算机网络知识汇总(十万字超详细)

文章目录 1 计算机网络概述1.1 概念、组成、功能和分类1.2 标准化工作及相关组织1.3 速率相关的性能指标1.4 时延、时延带宽积、往返时间RTT、利用率1.5 分层结构、接口、协议、服务1.6 OSI参考模型1.7 TCP/IP与五层参考模型1.8 第一章知识大纲 2.物理层2.1 物理层基本概念2.2 …

GaussDB(for MySQL)云原生数据库技术演进和挑战

摘要&#xff1a;GaussDB(for MySQL)是华为自研云原生数据库&#xff0c;具有高性能&#xff0c;高扩展&#xff0c;高可靠的特点&#xff0c;完全兼容MySQL协议&#xff0c;自研架构和友好的生态兼容性&#xff0c;可以同时满足数据库管理员、应用开发者、CTO的运维、使用和业…