Java线程和关机钩
作者:互联网
我刚遇到一个有趣的问题.看来,如果在Java中,线程调用System.exit(),则无法通过Thread.join()将其联接.
这引起了我的问题,因为我想在应用程序之后使用关闭挂钩进行清理,例如:
Runtime.getRuntime.addShutdownHook(new Thread() {
public void run() {
reader.join();
writer.join();
in.close();
out.close();
}
});
其思想是确保关闭线程之前,线程已使用各自的资源完成操作.问题是在3种情况下可以调用关闭挂钩.他们是:
>用户点击[ctrl] [C].
> Reader线程完成,并调用System.exit().
> Writer线程完成,并调用System.exit().
用户点击[ctrl] [C]的第一种情况效果很好.但是在其他两种情况下,关闭挂钩永远会阻塞.这是对一个已经调用System.exit()的线程调用的Thread.join()永久阻塞这一事实的连锁效应.
因此,我有2个问题.首先,我知道我可以改用Thread.join(long millis),这样它们就不会无限期地阻塞,但是谁能想到一个更优雅的解决方案?其次,虽然可以对同一个线程调用Thread.join()两次,而第二次它只会立即返回,但是有人知道为什么对已经调用System.exit的线程调用Thread.join()的原因吗? ()无限期阻止,并且不立即返回吗?
解决方法:
如果成功,System.exit甚至不会通过引发异常返回,因此该线程将永远无法完成.在关闭挂接之前这不是问题.
解决方法是使用通常的标准锁(甚至只是使用new Thread(new Runnable(){public void run(){System.exit(0);}}).start();对其进行破解).
标签:shutdown-hook,multithreading,sigint,java 来源: https://codeday.me/bug/20191123/2064368.html