gpt4 book ai didi

Java deleteOnExit 和 addShutdownHook - 哪个先出现?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:38:06 25 4
gpt4 key购买 nike

我有一些调用 deleteOnExit() 的临时文件。我还有一个 runnable,我使用 addShutdownHook() 注册它,以便在调用 System.exit 时运行。

是否可以保证在我的关闭 Hook 运行时临时文件仍然可用?

最佳答案

当我们查看底层实现时,两者都在处理 Shutdown-Hook。

  1. 当我们处理addShutdownHook(ApplicationShutdownHooks)时,我们的代码中有如下一段代码。

    Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
    <<---Do the Implementations here--->>
    }
    });

在 Java 源代码内部,ApplicationShutdownHooks 的实现如下所示,并从运行时类中调用,如此链接中所述 http://www.docjar.com/html/api/java/lang/Runtime.java.html

class ApplicationShutdownHooks {
/* The set of registered hooks */
private static IdentityHashMap<Thread, Thread> hooks;
static {
try {
Shutdown.add(1 /* shutdown hook invocation order */,
false /* not registered if shutdown in progress */,
new Runnable() {
public void run() {
runHooks();
}
}
);
  1. 而当我们处理 File.deleteOnExit() 时,Java 会在内部注册关闭,如下所示。

            // DeleteOnExitHook must be the last shutdown hook to be invoked.
    // Application shutdown hooks may add the first file to the
    // delete on exit list and cause the DeleteOnExitHook to be
    // registered during shutdown in progress. So set the
    // registerShutdownInProgress parameter to true.
    sun.misc.SharedSecrets.getJavaLangAccess()
    .registerShutdownHook(2 /* Shutdown hook invocation order */,
    true /* register even if shutdown in progress */,
    new Runnable() {
    public void run() {
    runHooks();
    }
    }
    );

    注意:上面注册钩子(Hook)的代码可以在JavaSourceCode中找到,如下:http://hg.openjdk.java.net/icedtea/jdk7/jdk/file/10672183380a/src/share/classes/java/io/DeleteOnExitHook.java http://hg.openjdk.java.net/icedtea/jdk7/jdk/file/10672183380a/src/share/classes/java/io/File.java

如果 Shutdown Hook 运行正常,我们将从系统中清除所有文件。但是,不能保证 Shutdown Hooks 每次都能正常运行。还有一些罕见的场景,您可以引用以下链接:

应用程序关闭 Hook :https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.线程)

删除退出: https://docs.oracle.com/javase/7/docs/api/java/io/File.html#deleteOnExit()

更具体地说,我们应该使用 ApplicationShutdownHooks 而不是 deleteOnExit(),因为 deleteOnExit() 使用大量内存,这些内存在 JVM 终止之前不会被释放。

注意:同样由于 deleteOnExit() 应用于 File 实例而不是 Path,我们还需要转换 Path通过调用如下方法到一个文件:

Path path = FileSystems.getDefault.getPath(".");
File asFile = path.toFile();
asFile.deleteOnExit();

关于Java deleteOnExit 和 addShutdownHook - 哪个先出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28970463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com