【问题标题】:Run a method on main thread/program termination?在主线程/程序终止上运行方法?
【发布时间】:2015-09-28 03:04:26
【问题描述】:
是否可以在主线程或整个程序终止时调用方法?我知道 Thread 的 .join() 方法,但我认为它不适用于主线程。例如,如果我创建一个临时目录,我想在程序终止时删除该临时目录,但我希望在程序终止时发生这种情况,而不是在 main 方法之后。
我不想要这个:
public static void main() {
....Do something
....Delete temp directory
}
【问题讨论】:
标签:
java
terminate
termination
【解决方案1】:
只需添加一个关闭挂钩..
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("ERMEHGERDDD");
}
});
来自 Javadoc:关闭挂钩只是一个已初始化但未启动的线程。当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩并让它们同时运行。
当所有非守护线程完成或调用 System.exit() 时,将调用关闭钩子。
【解决方案2】:
作为上述用户:Mad Programmer,您可以使用ShutdownHook。
public static void main(String[] args)
{
ShutdownHookThread shutdownHook = new ShutdownHookThread();
Runtime.getRuntime().addShutdownHook(shutdownHook );
}
private static class JVMShutdownHook extends Thread
{
public void run()
{
// tempDirectory.delete();
}
}
【解决方案3】:
我看到了四种可能的方法。
- 使用您自己的 Thread 子类和重写的 run() 方法。为线程终止添加 finally 块。
2. 使用具有类似装饰的 Runnable,可能作为提供的 Runnable 的包装器。这种情况的一个变体是子类化 Thread 以便在构造时应用这个包装器。
3.创建第二个线程以在真实线程上加入(),从而检测其终止。
4.使用instrumentation重写Thread.run()方法如上。