在.NET中,您可以检查Environment.HasShutdownStarted
属性以查看您的服务是否因任何原因被卸载,并执行正常的卸载/清理。
所以而不是:
while (true) { }
......你可以使用......
while (!Environment.HasShutdownStarted) { }
Java中有相同的东西吗?
答案 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();
}
这不是一个完美的解决方案,但应该至少让你朝着正确的方向前进。