我目前面临在Web应用程序中执行以下线程的挑战:
return new Runnable() {
@Override
public void run() {
long lastHeartBeat = -1;
while (true) {
if (isFullAbortRequested()) {
break;
}
if (lastHeartBeat == -1 || lastHeartBeat + 1000 * 60 < new Date().getTime()) {
// once every x minutes send a "i'm still alive!"
DEFAULT_LOGGER.info("still alive!");
lastHeartBeat = new Date().getTime();
}
//DO SOMETHING THAT TAKES 1 MIN
try {
Thread.sleep(1000);
} catch (final InterruptedException e) {
DEFAULT_LOGGER.error("CACHE REFRESH SERVICE DOWN");
}
}
}
};
此问题的原因是几天后它停止(没有任何已知原因)。这是此类“ while(true)睡眠”线程上的“预期行为”,它们可能会被OS(?)或其他任何功能关闭吗?
对于这种“如果必须做某事,每秒检查一次,如果是,请每秒检查一次(可能需要1分钟)。然后在下一次检查之前等待一秒钟”,将是一种持久的解决方案吗? “做某事”中的操作绝不能并行化或重叠,因此它们应对此线程阻塞。
提前谢谢!