Java线程学习笔记(两) 线程异常处理

时间:2023-03-08 17:01:48
Java线程学习笔记(两) 线程异常处理

线程捕获异常:

情况下,我们在main()方法里是捕捉不到线程的异常的,比例如以下面代码:

public class ExceptionThread implements Runnable{
@Override
public void run() {
throw new NullPointerException();
} public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
try {
System.out.println("运行线程");
executorService.execute(new ExceptionThread());
} catch (Exception e) {
e.printStackTrace();
System.out.println("捕捉异常");
}
}
}

上述代码并不能在main方法里捕捉线程异常,那么我们怎么才干捕捉到线程的异常信息呢?

以下我们看这段代码

/**
* 定义异常线程内容
*/
class MyExceptionThread implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
// 捕捉异常后的业务处理放在这里
System.out.println("捕捉的异常信息例如以下");
System.out.println(e);
}
} /**
* 定义异常线程工厂
*/
class ExceptionThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
// 此处是捕捉异常的设置。
thread.setUncaughtExceptionHandler(new MyExceptionThread());
return thread;
}
} /**
* 执行线程
*/
class ExceptionThread2 implements Runnable{
@Override
public void run() {
try {
Thread.sleep(1000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 抛出异常
throw new NullPointerException();
} public static void main(String[] args) {
// 通过我们自己写的ExceptionThreadFactory线程工厂,构造线程池
ExecutorService executorService = Executors.newCachedThreadPool(new ExceptionThreadFactory());
try {
System.out.println("执行线程");
// 启动三个线程
executorService.execute(new ExceptionThread2());
executorService.execute(new ExceptionThread2());
executorService.execute(new ExceptionThread2());
} catch (Exception e) {
e.printStackTrace();
System.out.println("捕捉异常");
}
}
}

上面的输出结果是

运行线程
捕捉的异常信息例如以下
java.lang.NullPointerException
捕捉的异常信息例如以下
java.lang.NullPointerException
捕捉的异常信息例如以下
java.lang.NullPointerException

得出的结论是:main()该方法仍然没有捕捉到异常的线程,当然,这个设置是合理的。现在每个线程都有自己的异常处理机制,怎么办呢,句子,创建一个线程时,该语句是好的~

收工。