【问题标题】:Java equivalent of .NET's Environment.HasShutdownStartedJava 等效于 .NET 的 Environment.HasShutdownStarted
【发布时间】:2012-11-28 22:40:30
【问题描述】:

在 .NET 中,您可以检查 Environment.HasShutdownStarted 属性以查看您的服务是否因任何原因被卸载,并执行正常卸载/清理。

所以而不是:

while (true) { }

...你可以使用...

while (!Environment.HasShutdownStarted) { }

Java 中有没有等价的东西?

【问题讨论】:

标签: java application-shutdown


【解决方案1】:

也许您正在寻找关闭挂钩?这允许您指定在应用程序关闭时要运行的线程(只要它没有使用kill -9 或类似方法强制关闭,但在这种情况下,没有环境可以保证在关闭时执行任何操作。)

Runtime.getRuntime().addShutdownHook(new Thread() {

    public void run() {
        //Code here.
    }
});

从实际的角度来看,您还应该使这些线程快速执行 - 因为否则应用程序将在退出时挂起,并且没有人喜欢这样(另外,操作系统或用户可能会选择终止应用程序,在任意点中止钩子。)

您可以添加多个关闭挂钩,它们将同时执行(并且以任意顺序)。

可以通过调用removeShutdownHook() 以类似方式关闭关闭挂钩。

【讨论】:

  • 如果我想在服务的生命周期内停止循环,我可以取消注册关闭挂钩吗?否则,这将是一种内存泄漏。
  • 感谢您的帮助。所有答案都很好,但你的答案排在第一位。
【解决方案2】:

您可以添加shutdown hook。基本上注册一个未启动的线程,该线程将在应用程序终止时运行。

Runtime.getRuntime().addShutdownHook(new Thread() {
   public void run() { 
      // logic for making a clean shutdown...
   }
})

上面的链接很好地描述了关机期间发生的事情。

【讨论】:

    【解决方案3】:

    你可以看看shutdown hook API,而不是做

    while(true) {
    }
    

    您可以在线程/可运行实现中声明一个成员来表示关闭:

    class MyRunnable implements Runnable {
        private running= false;
    
        public void setRunning(boolean running) {
            running= running;
        }
    
        public void run() {
            setRunning(true);
            while(running) {
                // do task
            }
        }
    }
    
    public static void main(String[] args) {
        final MyRunnable myRunnable= new MyRunnable();
        final Thread runThread= new Thread(myRunnable);
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                myRunnable.setRunning(false);
            }
        });
    
        runThread.start();
        runThread.join();
    }
    

    这不是一个完美的解决方案,但至少应该让你朝着正确的方向前进。

    【讨论】:

    • 谢谢。如果它不完美,为什么? :) 我正在构建一个以稳健性为关键的服务。另外,如果出于某种原因我想在服务的生命周期内显式停止循环运行,我可以取消注册关闭挂钩吗?否则,这将是一种内存泄漏。
    • 我不确定我是否涵盖了许多与此相关的细微差别。就像我说的,这是一个开始。至于取消注册钩子,还有一个 removeShutdownHook 采用与注册相同的参数。通常,如果你注册了一个关闭钩子,它只会在 VM 退出时执行。在这个钩子运行时,你的虚拟机正在退出,并且没有停止关闭过程。
    猜你喜欢
    • 2011-03-23
    • 2010-11-20
    • 2019-04-15
    • 2011-01-27
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多