Java相当于.NET的Environment.HasShutdownStarted

时间:2012-12-11 11:18:38

标签: java application-shutdown

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

所以而不是:

while (true) { }

......你可以使用......

while (!Environment.HasShutdownStarted) { }

Java中有相同的东西吗?

3 个答案:

答案 0 :(得分:1)

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

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

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

从实际角度来看,你也应该让这些线程快速执行 - 否则应用程序似乎会在退出时挂起,没有人喜欢(加上操作系统或用户可能选择杀掉应用程序,在任意点上中止钩子。)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

您可以查看关闭挂钩API,而不是执行

while(true) {
}

您可以在thread / runnable实现中声明一个成员来表示shutdown:

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();
}

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