多线程异常第一种处理方式:局部处理
- 在多线程编程中,如果主线程出现异常,我们可以使用try/catch等方式轻松的处理异常;
- 如果子线程出现异常,则需要在每个子线程中可能发生异常的地方用try/catch进行处理,代码如下:
public class CommonThread implements Runnable {
@Override
public void run() {
try {
throw new RuntimeException();
} catch (Exception e) {
System.out.println("捕获到" + Thread.currentThread().getName() + "子线程异常");
}
}
public static void main(String[] args) {
new Thread(new CommonThread(), "线程1").start();
new Thread(new CommonThread(), "线程2").start();
}
}
捕获到线程1子线程异常
捕获到线程2子线程异常
多线程异常第二种处理方式:全局处理
- 一旦需要开启的线程数较多,我们则需要在每个线程需要执行的run方法里面用try/catch捕获,这无疑是什么繁琐的,因此我们可以用UncaughtExceptionHandler进行全局线程异常捕获,代码如下:
public class UncaughtInThread implements Runnable {
@Override
public void run() {
throw new RuntimeException();
}
public static void main(String[] args) {
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println(t.getName() + "发生异常:" + e);
}
});
new Thread(new UncaughtInThread(), "线程1").start();
new Thread(new UncaughtInThread(), "线程2").start();
}
}
捕获到线程1子线程异常
捕获到线程2子线程异常