本文内容部分引自《Java多线程编程核心技术》,感谢作者!!!
代码地址:https://github.com/xianzhixianzhixian/thread.git
线程运行时出现问题的几种解决办法
1、为特定线程指定一个异常处理器
thread.setUncaughtException(new UncaughtExceptionHandler(){
@Override
public void uncaughtException(Thread t, Threowable e) {
//这里是对特定线程异常的处理
}
})
2、为所有线程指定默认的异常处理器
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(){
@override
public void uncaughtException(Thread t, Throwable e) {
//此处处理所有线程的异常
}
});
代码示例
MyThread.java
/**
* 异常在线程之间的传递
* @author: xianzhixianzhixian
* @date: 2019-02-28 22:38
*/
public class MyThread extends Thread {
private String num = "a";
public MyThread() {
super();
}
public MyThread(ThreadGroup group, String name) {
super(group, name);
}
@Override
public void run() {
int numInt = Integer.parseInt(num);
System.out.println("在线程中打印:"+ (numInt+1));
}
}
为特定线程指定异常处理器
ObjectUncaughtExceptionHandler.java
/**
* @author: xianzhixianzhixian
* @date: 2019-02-28 22:42
*/
public class ObjectUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("对象的异常处理");
e.printStackTrace();
}
}
Run.java
public class Run0 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.setUncaughtExceptionHandler(new ObjectUncaughtExceptionHandler());
myThread.start();
}
}
运行结果:线程运行出现抛异常时,被指定的异常捕获器捕获
为所有线程指定默认的异常处理器
StateUncaughtExceptionHandler.java
/**
* @author: xianzhixianzhixian
* @date: 2019-02-28 22:43
*/
public class StateUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("静态的异常处理");
e.printStackTrace();
}
}
Run.java
/**
* @author: xianzhixianzhixian
* @date: 2019-02-28 22:43
*/
public class Run1 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
MyThread.setDefaultUncaughtExceptionHandler(new StateUncaughtExceptionHandler());
myThread.start();
}
}
运行结果:线程运行出现异常时被默认的异常处理器捕获