主线程捕捉线程池中线程抛出的异常

package 线程池;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

/**
 * 目的:主线程捕捉线程池中线程抛出的异常
 * 步骤如下:
 * 第一步:创建一个任务类同时创建一个捕获线程异常处理类,这个类实现捕获线程的接口。
 * 第二步:创建一个工厂类,这个工厂类负责创建线程,然后把任务对象放入线程中,接着通过setUncaughtExceptionHandler
 *    	  把捕获线程的对象赋给线程对象。
 * 第三步:在缓冲池中通过执行器拿到线程抛出的异常。
 * @author kevin4wang
 */
/**
 * ExceptionThread2:任务对象
 * @author kevin4wang
 */
class ExceptionThread2 implements Runnable{
	@Override
	public void run() {
		Thread t = Thread.currentThread();
		System.out.println("run() by"+t);//run() byThread[Thread-0,5,main]
		System.out.println("eh 为捕获异常处理的对象"+t.getUncaughtExceptionHandler());//eh 为捕获异常处理的对象线程池.MyUncaughtExceptionHandler@3d012ddd
		throw new RuntimeException();
	}
}
/**
 * MyUncaughtExceptionHandler:为捕获线程异常处理的类
 * @author kevin4wang
 */
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
	@Override
	public void uncaughtException(Thread t, Throwable e) {
		System.out.println(t+"捕获到了异常,为捕获异常处理的对象为:"+e);//e:抛出的对象
	}
}
/**
 * 使用工厂的目的就是给每一个线程赋予一个线程异常处理类
 * @author kevin4wang
 */
class HandleThreadFactory implements ThreadFactory{

	@Override
	public Thread newThread(Runnable r) {
		System.out.println(this+"creation new Thread");//显示正在创建一个新线程 。 线程池.HandleThreadFactory@1ee0005creation new Thread
		Thread t = new Thread(r );//把任务对象放入线程中
		System.out.println("create "+t);//显示已创建的线程 。create Thread[Thread-0,5,main]
		t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());//为每一个线程添加一个处理线程异常的类
		System.out.println("newThread  eh="+t.getUncaughtExceptionHandler());//查看抛出异常处理的对象。newThread  eh=线程池.MyUncaughtExceptionHandler@3d012ddd
		return t;
	}
}

public class CaptureUncaughtException {
	/*为每一个线程设置异常处理器*/
//	public static void main(String[] args) {
//		ExecutorService exec = Executors.newCachedThreadPool(new HandleThreadFactory());
//		exec.execute(new ExceptionThread2());
//	}
	/*在代码中处处使用相同的异常处理器,在线程类里设置一个静态域*/
	public static void main(String[] args) {
		Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
		ExecutorService exec = Executors.newCachedThreadPool();
		exec.execute(new ExceptionThread2());
	}
	
}


 
 

你可能感兴趣的:(并发编程)