高并发编程:11、程序添加钩子、捕捉线程中抛出的异常、打印调用关系

一、概述

  • 添加钩子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
---------------程序结束---------------
程序结束...

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值