在 .NET 中,您可以检查Environment.HasShutdownStarted
属性以查看您的服务是否因任何原因被卸载,并执行正常卸载/清理。
所以而不是:
while (true) { }
...您可以使用...
while (!Environment.HasShutdownStarted) { }
Java中有没有等价的东西?
在 .NET 中,您可以检查Environment.HasShutdownStarted
属性以查看您的服务是否因任何原因被卸载,并执行正常卸载/清理。
所以而不是:
while (true) { }
...您可以使用...
while (!Environment.HasShutdownStarted) { }
Java中有没有等价的东西?
也许您正在寻找关闭挂钩?这允许您指定在应用程序关闭时要运行的线程(只要它没有被残酷地强制关闭kill -9
或类似,但在这种情况下,没有环境可以保证在关闭时执行任何操作。)
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
//Code here.
}
});
从实际的角度来看,您还应该使这些线程快速执行 - 因为否则应用程序将在退出时出现挂起,并且没有人喜欢这样(另外,操作系统或用户可能会选择终止应用程序,中止钩子在任意点。)
您可以添加多个关闭挂钩,它们将同时执行(并且以任意顺序)。
可以通过调用以类似的方式移除关闭挂钩removeShutdownHook()
。
您可以添加一个关闭挂钩。基本上注册一个未启动的线程,该线程将在应用程序终止时运行。
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// logic for making a clean shutdown...
}
})
上面的链接很好地描述了关机期间发生的事情。
您可以查看关闭挂钩 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();
}
这不是一个完美的解决方案,但至少应该让您朝着正确的方向前进。