所以当特定的事情发生时我设法结束我的线程,
但是我想保证自己的安全,以防万一我提到的具体事情没有发生, 所以我不会在线程内陷入无限循环。
所以我所做的是使用 5 分钟的计时器,以防万一,即使不满足“while”条件,该线程也会以某种方式终止。 我是这样做的:
shouldRun = true;
doSomething();
Thread myThread = new Thread(() -> {
long start = System.currentTimeMillis();
long end = start + 60*1000*5;
try {
while (shouldRun && System.currentTimeMillis() < end) {
if (!someCondition()) {
doAnotherThing();
}
}
} catch(Exception e) {
logger.error("Thread has failed while running with an exception error: {} ", e);
}
}).start();
doTaskThatTakesOneMinuteToRun();
shouldRun = false;
上面的逻辑是有效的,但我想知道是否有一种更优雅/专业/正确的方法来实现我正在做的事情,并通过计时来结束线程,如果“while”条件是 “shouldRun”永远不会是假,因为之前的方法被卡住了或者什么的。
最佳答案
如果不需要经常运行while循环,可以将其替换为for循环并添加Thread.sleep(millis)
。这样,它将运行的时间大致为迭代次数乘以 sleep 时间(如果循环中的其他操作足够快以进行分析)。没有 sleep 的 for 循环似乎更难以预测。
您也可以稍后从代码的其他部分调用 Thread.interrupt()
并检查 Thread.isInterrupted()
,但这不会太多与更改 shouldRun
的值不同,并且由于您没有考虑此选项,因此它可能在您的情况下不可行。
关于java - 确保线程在完成某些任务时完成的最优雅的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62246955/