一、概述
- 添加钩子addShutdownHook: 程序结束时会执行钩子程序里面的代码,命中行中kill程序也会执行,但kill -9 钩子程序不会执行
- 捕捉线程中抛出的异常
- 打印调用关系
二、代码
public class Thread14 {
public static void main(String[] args) {
// 钩子程序
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("---------------程序结束---------------");
System.out.println("程序结束...");
}
});
Thread thread = new Thread(new Runnable() {
public void run() {
Test1 test1 = new Test1();
test1.test();
}
});
// 捕捉线程中抛出的异常
thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
System.out.println("---------------捕捉线程中抛出的异常---------------");
System.out.println(t);
System.out.println(e);
}
});
thread.start();
}
static class Test1 {
public void test() {
System.out.println("test1");
Test2 test2 = new Test2();
test2.test2();
}
}
static class Test2 {
public void test2() {
System.out.println("test2");
// 打印调用关系
System.out.println("---------------打印调用关系---------------");
StackTraceElement[] element = Thread.currentThread().getStackTrace();
for(StackTraceElement ele : element) {
System.out.println(ele.getClassName() + " " + ele.getMethodName() + " " + ele.getLineNumber());
}
System.out.println("---------------打印调用关系结束---------------");
int index = 0;
while (true) {
System.out.println(index);
if(index >= 5) {
int s = index/0;
System.out.println(s);
}
try {
Thread.sleep(1*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
index++;
}
}
}
}
test1
test2
---------------打印调用关系---------------
java.lang.Thread getStackTrace 1559
com.cfl.thread.Thread14$Test2 test2 52
com.cfl.thread.Thread14$Test1 test 43
com.cfl.thread.Thread14$2 run 25
java.lang.Thread run 748
---------------打印调用关系结束---------------
0
1
2
3
4
5
---------------捕捉线程中抛出的异常---------------
Thread[Thread-1,5,main]
java.lang.ArithmeticException: / by zero
---------------程序结束---------------
程序结束...