131-如何给你的应用程序注入钩子程序,Linux下演示
如何获取线程的Exception?
我知道线程的
void run()
方法是不可以抛出异常的,如果线程死掉,调用者是不知道线程执行情况的。如果没有捕获异常,在错误的情况下只是输出堆栈信息,调用者并不知道是什么异常导致。
线程的栈可以跟踪到方法调用。
JDK模式:client、server
server模式会进行运行时优化。JIT,即Just In Time
Runtime可以调用一些系统命令
public class ExitCapture {
public static void main(String[] args) {
while (true) {
Thread.sleep(1_000L);
System.out.println("I am working...");
}
}
}
javac ExitCapture.java
java -cp . ExitCapture
nohup java -cp . ExitCapture &
tail -f nohup.out
kill 2181
如果程序占用了很多数据库连接或者是文件句柄,想要在kill程序的时候一并进行释放,或者在异常退出程序的情况下通知一下调用者程序知道它出错了,并不是调用者时时地去监控程序。(程序主动告诉,并不是被动发现)
public class ExitCapture {
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("The application will be exit.");
notifyAndRelease();
}));
int i = 0;
while (true) {
Thread.sleep(1_000L);
System.out.println("I am working...");
i++;
if (i > 20) {
throw new RuntimeException("Error");
}
}
}
private static void notifyAndRelease() {
System.out.println("notify to the admin.");
Thread.sleep(1_000L);
System.out.println("Will release resource(socket, file, connection.)");
Thread.sleep(1_000L);
System.out.println("Release and Notify Done!");
}
}
运行程序,在i>20时程序抛出异常,被捕获到并执行notifyAndRelease()
;通过kill
杀死程序也可以被捕获并执行notifyAndRelease()
,但是使用kill -9
强制杀死程序则不会执行notifyAndRelease()
。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com
文章标题:131-如何给你的应用程序注入钩子程序,Linux下演示
文章字数:407
本文作者:神秘的小岛岛
发布时间:2019-12-07, 18:40:12
最后更新:2019-12-07, 20:05:10
原始链接:https://www.tuyrk.cn/wang-thread/131-hook-processor/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。