<pre name="code" class="html">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());
}
}
主线程捕捉线程池中线程抛出的异常
最新推荐文章于 2024-07-31 17:49:49 发布