JAVA并发,线程异常捕获

由于线程的特性,当我们启动了线程是没有办法用try catch捕获异常的,如下例:

 1 package com.xt.thinks21_2;
 2
 3 import java.util.concurrent.ExecutorService;
 4 import java.util.concurrent.Executors;
 5
 6 /**
 7  * 线程异常捕获测试
 8  *
 9  * @author xue
10  *
11  */
12 public class ThreadUncaughtExceptionTest implements Runnable {
13
14     @Override
15     public void run() {
16         // TODO Auto-generated method stub
17         throw new NullPointerException();
18     }
19
20     public static void main(String[] args) {
21         try {
22             ExecutorService es = Executors.newCachedThreadPool();
23             es.execute(new ThreadUncaughtExceptionTest());
24             es.shutdown();
25             // or this
26             // Thread t = new Thread(new ThreadUncaughtExceptionTest());
27             // t.start();
28         } catch (Exception e) {
29             // TODO: handle exception
30         }
31
32     }
33 }

打印异常信息为:

Exception in thread "pool-1-thread-1" java.lang.NullPointerException
at com.xt.thinks21_2.ThreadUncaughtExceptionTest.run(ThreadUncaughtExceptionTest.java:17)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

此时,我们需要为线程定制工厂类来生产线程,为线程指定UncaughtExceptionHandler

 1 package com.xt.thinks21_2;
 2
 3 import java.lang.Thread.UncaughtExceptionHandler;
 4 import java.util.concurrent.ExecutorService;
 5 import java.util.concurrent.Executors;
 6 import java.util.concurrent.ThreadFactory;
 7
 8 /**
 9  * 未捕获异常执行程序
10  *
11  * @author Administrator
12  *
13  */
14 class ThreadUncaughtExceptionHandler implements UncaughtExceptionHandler {
15
16     @Override
17     public void uncaughtException(Thread t, Throwable e) {
18         // TODO Auto-generated method stub
19         System.out.println("caught:" + e);
20     }
21
22 }
23
24 /**
25  * 线程工厂
26  *
27  * @author Administrator
28  *
29  */
30 class HandlerThreadExceptionFactory implements ThreadFactory {
31
32     @Override
33     public Thread newThread(Runnable r) {
34         // TODO Auto-generated method stub
35         Thread t = new Thread(r);
36         t.setUncaughtExceptionHandler(new ThreadUncaughtExceptionHandler());
37         return t;
38     }
39
40 }
41
42 /**
43  * 线程异常捕获测试
44  *
45  * @author xue
46  *
47  */
48 public class ThreadUncaughtExceptionTest implements Runnable {
49
50     @Override
51     public void run() {
52         // TODO Auto-generated method stub
53         throw new NullPointerException();
54     }
55
56     public static void main(String[] args) {
57         ExecutorService es = Executors
58                 .newCachedThreadPool(new HandlerThreadExceptionFactory());
59         es.execute(new ThreadUncaughtExceptionTest());
60         es.shutdown();
61     }
62 }

此时,我们就可以看到异常信息被捕获到了:

caught:java.lang.NullPointerException

时间: 2024-10-12 08:40:37

JAVA并发,线程异常捕获的相关文章

Java 并发 线程属性

Java 并发 线程属性 @author ixenos 线程优先级 1.每当线程调度器有机会选择新线程时,首先选择具有较高优先级的线程 2.默认情况下,一个线程继承它的父线程的优先级 当在一个运行的线程A里,创建另一个线程B的时候,那么A是父线程,B是子线程.当在一个运行的线程A里,创建线程B,然后又创建了线程C,这时候虽然B比C创建早,可是B并不是C的父线程,而A是B和C的父线程. 3.线程的优先级高度依赖于系统,当虚拟机依赖于宿主机平台的线程实现机制时,Java线程的优先级被映射到宿主机平台

Java 并发 线程同步

Java 并发 线程同步 @author ixenos 同步 1.异步线程本身包含了执行时需要的数据和方法,不需要外部提供的资源和方法,在执行时也不关心与其并发执行的其他线程的状态和行为 2.然而,大多数实际的多线程应用中,两个或两个以上的线程需要共享对同一数据的存取,这将产生同步问题(可见性和同步性的丢失) 比如两个线程同时执行指令account[to] += amount,这不是原子操作,可能被处理如下: a)将account[to]加载到寄存器 b)增加amount c)将结果写回acco

Java 并发 线程的优先级

Java 并发 线程的优先级 @author ixenos 低优先级线程的执行时刻 1.在任意时刻,当有多个线程处于可运行状态时,运行系统总是挑选一个优先级最高的线程执行,只有当线程停止.退出或者由于某些原因不执行的时候,低优先级的线程才可能被执行 2.两个优先级相同的线程同时等待执行时,那么运行系统会以round-robin的方式选择一个线程执行(即轮询调度,以该算法所定的)(Java的优先级策略是抢占式调度!) 3.被选中的线程可因为一下原因退出,而给其他线程执行的机会: 1) 一个更高优先

Java 并发 线程的生命周期

Java 并发 线程的生命周期 @author ixenos 线程的生命周期 线程状态: a)     New 新建 b)     Runnable 可运行 c)     Running 运行 (调用getState()时显示为Runnable) d)     Blocked 阻塞 i.          I/O阻塞 (不释放锁) I/O操作完成解除阻塞,进入Runnable状态 ii.          同步阻塞(不释放锁) 运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会

理解和解决Java并发修改异常ConcurrentModificationException(转载)

原文地址:https://www.jianshu.com/p/f3f6b12330c1 理解和解决Java并发修改异常ConcurrentModificationException 不知读者在Java开发的过程中有没有遇到类似的异常信息 Exception in thread "main" java.util.ConcurrentModificationException, 下面小编简单介绍异常原因以及这种异常的改进方法,内容很简单,有什么问题还望指正. 假设我们要实现这样一个例子:

JAVA Thread线程异常监控

一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 public class NoCaughtThread implements Runnable{ @Override public void run() { System.out.println(3 / 2); System.out.println(3 / 0); System.out.println(3

java并发-线程

前言 近来时间比较充裕,正好又看了一遍<实战java高并发程序设计>,故而对java并发一些知识进行下总结,算是温故而知新吧. 一,线程基础 1,新建线程 一般有两种实现方式实现Runnable接口或继承Thread类(Thread类本身也是实现Runnable接口) public class Test { public static void main(String[] args) throws Exception { Thread t1=new TestThread(); Thread t

java并发-线程饥饿死锁测试

线程饥饿死锁 <Java并发编程实践>中对线程饥饿死锁的解释是这样的:在使用线程池执行任务时,如果任务依赖于其他任务,那么就可能产生死锁问题.在单线程的Executor中,若果一个任务将另一个任务提交到同一个Executor,并且等待这个被提交的任务的结果,那么这必定会导致死锁.第一个任务在工作队列中,并等待第二个任务的结果:而第二个任务则处于等待队列中,等待第一个任务执行完成后被执行.这就是典型的线程饥饿死锁.即使是在多线程的Executor中,如果提交到Executor中的任务之间相互依赖

Java并发——线程间的等待与通知

前言: 前面讲完了一些并发编程的原理,现在我们要来学习的是线程之间的协作.通俗来说就是,当前线程在某个条件下需要等待,不需要使用太多系统资源.在某个条件下我们需要去唤醒它,分配给它一定的系统资源,让它继续工作.这样能更好的节约资源. 一.Object的wait()与notify() 基本概念: 一个线程因执行目标动作的条件未能满足而被要求暂停就是wait,而一个线程满足执行目标动作的条件之后唤醒被暂停的线程就是notify. 基本模板: synchronized (obj){ //保护条件不成立