本文內容部分引自《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();
}
}
運行結果:線程運行出現異常時被默認的異常處理器捕獲