主线程中捕获子线程异常

2023-10-30

需求:主线程独立执行,无需等待子线程执行完毕,子线程如有异常抛出可自行catch

网上介绍的方法一般是

1,在线程内部进行try/catch捕获异常。
2,通过线程池的submit方法,获取Future对象,然后try/catch Future.get()方法来处理异常。

第一种,线程内部try/catch,有时候可能不希望在编写子线程的时候直接进行异常处理,而是将异常抛出,交由调用者处理。

第二种,会造成线程等待问题。调用Future.get()方法需要等待子线程完成,如果是耗时较长的子线程任务,会严重影响主线程速度。

解决方案:利用Thread.setUncaughtExceptionHandler()方法,保证主线程的独立执行,并且能处理子线程异常。

示例代码:

       public static void main(String[] args) {
        int A = 10;
        int B = 0;

        System.out.println("start");


        Thread t1 = new Thread(() -> {
            System.out.println("t1");
            int result = A / B;
        });

        t1.setUncaughtExceptionHandler(((t, e) -> {
            try {
                t.sleep(3000);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            System.out.println(t + ":" + e);
        }));

        Thread t2 = new Thread(() -> {
            System.out.println("t2");
            int result = A / B;
        });

        t1.start();
        t2.start();

        System.out.println("end");
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

主线程中捕获子线程异常 的相关文章

  • Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore

    Java并发编程 CountDownLatch CyclicBarrier和 Semaphore 2016 10 07 分类 基础技术 7 条评论 标签 并发 分享到 0 原文出处 海子 在java 1 5中 提供了一些非常有用的辅助类来帮
  • 线程相关面试题

    1 ThreadPoolExecutor 线程池执行 有哪些常用的方法 1 执行线程池 submit excute 2 终止线程池 shutdown 3 判断线程是否终止 isShutdown 4 获取正在运行的线程数 getAcitive
  • 线程的优先级

    package com kuang Demo05 测试线程的优先级 public class TestPriority public static void main String args System out println Threa
  • 死锁产生条件和解决办法

    死锁 死锁产生的四个条件 产生死锁必须同时满足以下四个条件 只要其中任一条件不成立 死锁就不会发生 互斥条件 线程要求对所分配的资源 如打印机 进行排他性控制 即在一段时间内某资源仅为一个线程所占有 此时若有其他线程请求该资源 则请求线程只
  • .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)

    选择自 playyuer 的 Blog Net C 实现支持断点续传多线程下载的 Http Web 客户端工具类 C DIY HttpWebClient Reflector 了一下 System Net WebClient 重载或增加了若干
  • Future 和 Callable

    一 Runnable 缺陷 不能返回一个返回值 不能抛出 checked Execption 二 Callable接口 类似于Runnable 被其他线程执行的任务 实现call方法 有返回值 三 Future的作用 Callable和Fu
  • Java使用多线程导入数据到Oracle中

    Oracle中的设置 多线程导入数据到Oracle中 如果是自己设置主键的值 那么肯定会遇到主键冲突的问题 例如线程A计算出的id为10 max id 1 在A线程还没有完成导入时线程B用相同办法得到的id也是10 这时两个线程都请求插入数
  • java使用线程池批量插入mysql数据

    首先我们使用最原始的for循环插入数据 for int i 0 i lt 100000000 i service add new LongTest setStatus 1 setName NumberUtil getPwdRandom 5
  • 关于Semaphore信号量的源码解读

    Semaphore的简单使用 利用Semaphore可以实现对线程数量的控制 比如如下的代码 class SemaphoreTest public static void main String args Semaphore semapho
  • java中什么是并发,如何解决?

    多个进程或线程同时 或着说在同一段时间内 访问同一资源会产生并发问题 银行两操作员同时操作同一账户就是典型的例子 比如A B操作员同时读取一余额为1000元的账户 A操作员为该账户增加100元 B操作员同时为该账户减去 50元 A先提交 B
  • 主线程退出后,子线程会不会退出

    额 好吧 这是个标题党 其实所有的线程都是平级的 根本不存在主线程和子线程 下文所述为了方便 将在main函数中的线程看做主线程 其它线程看成子线程 特此说明 先考虑以下代码 include
  • 并发编程4 - 线程状态、死锁及ReentrantLock

    文章目录 一 再述线程状态转换 二 多把锁与线程活跃性问题 1 多把锁 2 活跃性 三 ReEntrantLock 1 基本用法 2 可重入 3 可打断 4 锁超时 5 公平锁 6 条件变量 一 再述线程状态转换 情况1 New RUNNA
  • 并发编程 (6)一不小心就死锁了,怎么办?

    在上一篇文章中 我们用 Account class 作为互斥锁 来解决银行业务里面的转账问题 虽然这个方案不存在并发问题 但是所有账户的转账操作都是串行的 例如账户 A 转账户 B 账户 C 转账户 D 这两个转账操作现实世界里是可以并行的
  • 02Linux下C语言锁的学习之Linux下的读写锁

    02Linux下C语言锁的学习之Linux下的读写锁 概述 下面的锁的意思均是代表读写锁 读写锁的特性 1 若一把锁被一个线程以读方式锁住 当其它线程以读方式上锁的话 那么可以上锁成功 2 若一把锁被一个线程以写方式锁住 当其它线程以读或者
  • JAVA实现简易HTTP服务器

    说实话 之前完全没有想过 我还能写出服务器 感觉服务器这么高端的东西 能会用就不错了 还能写 不吐槽了 开始了 这次的作业是搭建一个服务器 要能接收请求 并给浏览器返回正确响应 项目的下载地址 项目目标 实现一个简易的多线程服务器 可以处理
  • wxwidgets编写多线程程序--wxThread

    细节描述 线程基本上来说是应用程序中一条单独执行的路径 线程有时被称为轻量级进程 但线程与进程的根本不同之处在于不同进程存储空间是相互独立的 而同一进程里的所有线程共享同一地址空间 尽管这使得它更容易共享几个线程间的普通数据 但这也使得它有
  • Java多线程(7):并发_线程同步_队列与锁(Synchronized)

    一 并发举例 线程不安全 1 两个人同时操作一张银行卡 如何保证线程安全 2 多个人同时购买一张火车票 谁能买到 二 并发特点 1 同一个对象 2 被多个线程操作 3 同时操作 三 如何保证线程安全 线程同步 队列 锁 1 使用队列的技术一
  • 多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!

    背景介绍 1 最近有一个大数据量插入的操作入库的业务场景 需要先做一些其他修改操作 然后在执行插入操作 由于插入数据可能会很多 用到多线程去拆分数据并行处理来提高响应时间 如果有一个线程执行失败 则全部回滚 2 在spring中可以使用 T
  • 多线程下载文件(支持暂停、取消、断点续传)

    多线程下载文件 支持暂停 取消 断点续传 多线程同时下载文件即 在同一时间内通过多个线程对同一个请求地址发起多个请求 将需要下载的数据分割成多个部分 同时下载 每个线程只负责下载其中的一部分 最后将每一个线程下载的部分组装起来即可 涉及的知
  • 线程安全的集合类

    Java中提供了许多集合类 其中有的是线程安全的 有的是线程不安全的 线程安全的集合类有 1 Vector Vector类实现了一个 动态数组 与ArrayList相似 但Vector是同步访问的 2 Stack Stack是Vector的

随机推荐

  • 动态规划-国王与金矿

    动态规划 国王与金矿 图文有点长 慢慢看 题目 有一座高度是10级台阶的楼梯 从下往上走 每跨一步只能向上1级或者2级台阶 要求用程序来求出一共有多少种走法 比如 每次走1级台阶 一共走10步 这是其中一种走法 我们可以简写成 1 1 1
  • python+django学习资料在线分享系统vue

    本站是一个B S模式系统 采用vue框架作为开发技术 MYSQL数据库设计开发 充分保证系统的稳定性 系统具有界面清晰 操作简单 功能齐全的特点 使得校园资料分享平台管理工作系统化 规范化 技术栈 后端 python django 前端 v
  • kafka整合lua消费不到数据解决方案

    用lua脚本将前端页面获取到的数据塞给kafka kafka不报错 nginx不报错 lua脚本也没有问题 topic生成了但就是消费不到数据 自己写一个生产者测试过证明消费者也没问题 折腾了很久 最后在kafka配置文件中加了host n
  • springboot中jsp配置tiles

    tiles是jsp的前端框架 像fream标签一样可以把多个页面组合起来 完成后的目录结构 1 pom xml中添加依赖
  • 深度Linux怎样关闭休眠,deepin如何休眠,

    deepin如何休眠 deepin官网 休眠这个功能还是很酷很实用的 对于Linux系统 休眠一般就是把内存中的数据写入硬盘 swap文件 然后关机 在下一次开机的时候将数据重新载入内存 让你快速回到上一次的工作状态 这在你开启了大量的程序
  • NATAPP使用详细教程(免费隧道内网映射)

    NATAPP https natapp cn tunnel lists NATAPP 在开发时可能会有将自己开发的机器上的应用提供到公网上进行访问 但是并不想通过注册域名 搭建服务器 由此可以使用natapp 内网穿透 购买免费隧道 修改隧
  • 动手学强化学习Day1-基本概念

    文章目录 1 1 什么是强化学习 1 2 强化学习的环境 1 3 强化学习的目标 1 4 强化学习的数据 1 5 强化学习的特征 1 1 什么是强化学习 在机器学习领域 有一类重要的任务和人生选择很相似 即序贯决策 sequential 任
  • C++ win32编程 02 常见消息

    02 常见消息 1 打印消息相关信息 1 1 将消息内容转化为字符串 第一步 定义字符串变量 用来保存转化后的消息 wchar t szInfo 300 定义消息内容变量 第二步 用宽字符格式化函数转化消息内容 wsprintf szInf
  • Ethereum开发

    Ethereum开发 1 简介 1 下载源码 使用Git Bath git clone https github com ethereum go ethereum git 或者使用浏览器下载 2 下载安装包 根据您的系统选择下载 2 官方网
  • Pytorch+LSTM+Encoder+Decoder实现Seq2Seq模型

    usr bin env Python3 coding utf 8 version v1 0 Author Meng Li contact 925762221 qq com FILE torch seq2seq py Time 2022 6
  • sys中stdin与stdout

    如果需要更好的控制输出 而print不能满足需求 sys stdout sys stdin sys stderr就是你需要的 sys stdout与print 在python中调用print时 事实上调用了sys stdout write
  • 特征工程专题

    特征工程 Feature Engineering中文版 特征学习笔记 Fire 特征选择 缺失值处理 数据预处理 林逸飞
  • 嵌入式毕设分享100例(一)

    单片机毕业设计项目分享系列 这里是DD学长 单片机毕业设计及享100例系列的第一篇 目的是分享高质量的毕设作品给大家 包含全面内容 源码 原理图 PCB 实物演示 论文 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的单片机项目缺少
  • ggplot2 画线性回归图

    本介绍如何使用R 可视化库 ggplot2 画拟合的线性回归模型 语法 ggplot data aes x y geom point geom smooth method lm 语法基本格式 其中还包括一些参数后面示例会涉及 1 简单示例
  • 总结:JDK源码

    一 JDK源码下载 地址 http jdk java net java se ri 8 选择版本 下载 RI Source Code 代码路径在 openjdk jdk src windows native 对应着java中的类名 如 jd
  • 200立方发酵罐图纸(总图)【年产600吨青霉素钠盐发酵车间工艺设计】

    200立方发酵罐图纸 发酵 原来指的是轻度发泡或沸腾状态 发酵现象早已被人们所认识 但了解它的本质却是近200年来的事 英语中发酵一词fermentation是从拉丁语fervere派生而来的 原意为 翻腾 它描述酵母作用于果汁或麦芽浸出液
  • VS2022解决方案及项目重命名

    问题 项目写完了才发现当时解决方案及项目的名字起的太狭窄了 就想着换个名字 注意下面的图片 都是已经名字改完的了 因为博客是后写的 名字换完了 产生了两个问题 问题一 文件冲突警告 警告MSB8028 中间目录 Debug 包含从另一个项目
  • 虚拟机无法上网原因合集

    普通原因 1 检查ip地址是否正确 root devin ip a 1 lo
  • 大数据用户画像实战之业务数据调研及ETL

    整个用户画像 UserProfile 项目中 数据 业务及技术流程图如下所示 其中数据源存储在业务系统数据库 MySQL 数据库中 采用SQOOP全量 增量将数据抽取到 HDFS Hive表中 通过转换为HFile文件加载到HBase表 1
  • 主线程中捕获子线程异常

    需求 主线程独立执行 无需等待子线程执行完毕 子线程如有异常抛出可自行catch 网上介绍的方法一般是 1 在线程内部进行try catch捕获异常 2 通过线程池的submit方法 获取Future对象 然后try catch Futur