2

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

所以而不是:

while (true) { }

...您可以使用...

while (!Environment.HasShutdownStarted) { }

Java中有没有等价的东西?

4

3 回答 3

1

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

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

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

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

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

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

于 2012-12-11T11:22:52.870 回答
1

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

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

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

于 2012-12-11T11:23:18.390 回答
1

您可以查看关闭挂钩 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();
}

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

于 2012-12-11T11:26:44.183 回答