如何在父线程中捕获来自子线程的异常呢

方法一:子线程中try... catch...

方法二:为线程设置异常处理器UncaughtExceptionHandler

(异常处理也是在子线程中执行,相当于在子线程中加上了一个异常拦截器,可以使用下面的程序验证)

(1)Thread.setUncaughtExceptionHandler设置当前线程的异常处理器

(2)Thread.setDefaultUncaughtExceptionHandler为整个程序设置默认的异常处理器

(3)new Thread(new ThreadTest() ,new runable{})时传入 ThreadGroup

方法三,通过Future的get方法捕获子线程异常

 

import java.util.concurrent.*;

public class ThreadTest extends ThreadGroup{

    private ThreadTest(){
super("ThreadTest");
} public static void main(String[] args) { System.out.println(Thread.currentThread().getId()); Thread t1=new Thread(new ThreadTest(),new Runnable() {//传入继承ThreadGroup的类对象
@Override
public void run() { try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} if (1==1){
throw new NullPointerException("111");
}
}
});
t1.start(); /*ExecutorService executorService = Executors.newFixedThreadPool(8);
Future future = executorService.submit(()->{
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} if (1==1){
throw new NullPointerException("111");
}
return 1;
}); try {
future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) { //e.getCause().printStackTrace();
e.printStackTrace();
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.shutdownNow();*/ } public void uncaughtException(Thread thread, Throwable exception)
{
/**
* 当线程抛出unckecked异常时,系统会自动调用该函数,但是是在抛出异常的线程内执行*/
System.out.println(Thread.currentThread().getId());
System.out.println(thread.getId());
exception.printStackTrace();//example, print stack trace
}
}

线程池阻塞方法的使用  future.get()

1.LockSupport.park()消费一个信号量,会一直阻塞,LockSupport.park(thread)增加一个信号量

2.UNSAFE.park(false, 0L) 消费一个信号量 会一直阻塞 UNSAFE.unpark(thread) 增加一个信号量

3.和wait,notify(),notifyAll()相比的优点

3.1 park 和 unpark无先后顺序 而wait,notify(),notifyAll() 有严格顺序

3.2 park 和 unpark

java 子线程异常处理的更多相关文章

  1. Java子线程中的异常处理(通用)

    在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally ...代码块就可以了.那么,在并发情况下,比如在父线程中启动了子线程,如何正确捕获子线程中的异常,从而进行相 ...

  2. 转:Java子线程中的异常处理(通用)

    引自:https://www.cnblogs.com/yangfanexp/p/7594557.html 在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally . ...

  3. Java子线程中操作主线程Private级别数据

    两个类分别如下: <pre name="code" class="java">package Demo2; import java.util.*; ...

  4. java 子线程定时去更改主线程的变量

    在一次代码编写场景,需要post一些数据,同时携带获得的token,(但是token的有效时间是7200s),但是post需要很多次,很长时间,不可能2小时候中断程序,手动去获取token,这样效率太 ...

  5. 外部线程停止Java子线程的方法

    一.Thread.stop()官方不推荐,Because it is inherently unsafe. 二.方式一1. 线程类示例 public class ThreadT1 implements ...

  6. java主线程捕获子线程中的异常

    本文主要参考:<think in java> 好,下面上货. 正常情况下,如果不做特殊的处理,在主线程中是不能够捕获到子线程中的异常的. 例如下面的情况. package com.xuey ...

  7. java 多线程 线程组ThreadGroup;多线程的异常处理。interrupt批量停止组内线程;线程组异常处理

    1,线程组定义: 线程组存在的意义,首要原因是安全.java默认创建的线程都是属于系统线程组,而同一个线程组的线程是可以相互修改对方的数据的.但如果在不同的线程组中,那么就不能"跨线程组&q ...

  8. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  9. Java主线程等待子线程、线程池

    public class TestThread extends Thread { public void run() { System.out.println(this.getName() + &qu ...

随机推荐

  1. Codeforces Round #350 (Div. 2)(670C)

    今天对着算法进阶指南,学了一下离散化.大概对桶排这样的算法优化比较好吧. 离散化:就是把无穷大的集合中若干个元素映射为有限集合以便于统计的方法.例如在很多时候,问题范围定义为整数集合Z,但涉及的元素只 ...

  2. AcWing 7. 混合背包问题

    #include<iostream> #include<algorithm> #include<cstring> using namespace std ; ; i ...

  3. Android Studio阶段性学习总结_1

    这半个月一直在学习Android方面的知识,对Android开发有了一个基本的认识,学会了Android studio的基本操作. 在建立第一个Android studio项目时,我遇到了很大的阻碍, ...

  4. 论文阅读笔记(四)【TIP2017】:Video-Based Pedestrian Re-Identification by Adaptive Spatio-Temporal Appearance Model

    Introduction (1)背景知识: ① 人脸识别是具有高可靠性的生物识别技术,但在低解析度(resolution)和姿态变化下效果很差. ② 步态(gait)是全身行为的生物识别特征,大部分步 ...

  5. WebService 之 SoapHeader

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  6. Linux 环境c++ 编码转换

    #include <iconv.h> //代码转换:从一种编码转为另一种编码 static int CodeConvert(char *from_charset,char *to_char ...

  7. Mysql多实例数据库安装应用

    第1章 MySQL多实例数据库企业级应用实践 1.1 MySQL多实例介绍 前文已经讲了为什么选择MySQL数据库,以及MySQL数据库在Linux系统下的多种安装方式,同时以单实例讲解了编译方式安装 ...

  8. springboot之json传参(后台控制层如何接收和解析参数)

    一般web端都是用form标签的形式进行表单提交到后台,后台控制层再用相应的实体对象去接收前端传来的json参数. 但是有时候前端界面很复杂,要传入后端的参数是各种标签里面的value值,这些值又是来 ...

  9. office2019与Visio2016不能共存解决办法

    我们电脑已经安装office2019,可是安装visio2016就会安装不了.只要两个软件同时安装就可以解决了,简单粗暴. 首先把电脑的offic或者visio都卸载了,删除干净. 然后先打开visi ...

  10. 页面回显与URL模板映射

    一.页面回显 对于需要返回界面的数据,可以将后台封装好的数据回显至原始jsp界面中. 举个例子: User.java package com.zk.data; public class User { ...