运行 main thread/program 终止的方法?
Run a method on main thread/program termination?
是否可以在主线程或整个程序终止时调用方法?我知道 Thread 的 .join() 方法,但我认为它不会在主线程上运行。例如,如果我创建一个临时目录,我想在程序终止时删除该临时目录,但我希望在程序终止时发生这种情况,而不是在 main 方法之类的东西之后。
我不想要这个:
public static void main() {
....Do something
....Delete temp directory
}
我看到了四种可能的方法。
- 使用您自己的 Thread 子类和重写的 运行() 方法。为线程终止添加一个 finally 块。
2.Use 具有类似装饰的 Runnable,可能作为提供的 Runnable 的包装器。它的一个变体是子类 Thread 以便在构造时应用这个包装器。
3.Create 第二个线程在真实线程上加入(),从而检测它的终止。
4.Use 重写 Thread.run() 方法的检测如上。
只需添加一个关闭钩子..
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("ERMEHGERDDD");
}
});
来自 Javadoc:关闭挂钩只是一个已初始化但未启动的线程。当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩,并让它们 运行 并发。
关闭挂钩将在所有非后台线程完成时或如果调用 System.exit() 时调用。
作为用户:Mad Programmer mentioned above, you could use 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();
}
}
是否可以在主线程或整个程序终止时调用方法?我知道 Thread 的 .join() 方法,但我认为它不会在主线程上运行。例如,如果我创建一个临时目录,我想在程序终止时删除该临时目录,但我希望在程序终止时发生这种情况,而不是在 main 方法之类的东西之后。
我不想要这个:
public static void main() {
....Do something
....Delete temp directory
}
我看到了四种可能的方法。
- 使用您自己的 Thread 子类和重写的 运行() 方法。为线程终止添加一个 finally 块。 2.Use 具有类似装饰的 Runnable,可能作为提供的 Runnable 的包装器。它的一个变体是子类 Thread 以便在构造时应用这个包装器。 3.Create 第二个线程在真实线程上加入(),从而检测它的终止。 4.Use 重写 Thread.run() 方法的检测如上。
只需添加一个关闭钩子..
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("ERMEHGERDDD");
}
});
来自 Javadoc:关闭挂钩只是一个已初始化但未启动的线程。当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩,并让它们 运行 并发。
关闭挂钩将在所有非后台线程完成时或如果调用 System.exit() 时调用。
作为用户:Mad Programmer mentioned above, you could use 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();
}
}