gpt4 book ai didi

java - 如何在无限循环中替换 Thread.sleep() ?

转载 作者:行者123 更新时间:2023-12-01 22:47:21 25 4
gpt4 key购买 nike

我的主程序内部有一个无限循环,它运行一个也是无限循环的作业,并等待它抛出错误。然后它会 hibernate 指定的时间并再次启动任务。

public static void main(String[] args) {
while (true) {
try {
MyClass myClass = new MyClass();
myClass.startInfiniteLoop();
}
catch (SomeException ex) {
try {
Thread.sleep(MyClass.DEFAULT_SLEEP_TIME);
}
catch (InterruptedException ex2) {
System.exit(-1);
}
}
}
}

这工作正常,但我想知道是否可以做得更好,也许使用 ExecutorService 因为我(和我的 IDE)不喜欢 Thread.sleep() > 在 while (true) 循环中。

我已经阅读了很多关于 ScheduledExecutorService 和任务管理的问题及其答案,但我没有找到这个特殊情况,因为它不是真正的时间表,我不知道是否以及何时任务如果要结束。

最佳答案

您可以使用 ScheduledExecutorService :

ScheduledExecutorService s=Executors.newScheduledThreadPool(1);
s.scheduleWithFixedDelay(new Runnable() {
public void run() {
try {
MyClass myClass = new MyClass();
myClass.startInfiniteLoop();
} catch(SomeException ex) {}
}
}, 0, MyClass.DEFAULT_SLEEP_TIME, TimeUnit.MILLISECONDS);

关键点是使用scheduleWithFixedDelay而不是 scheduleAtFixedRate 来确保后续执行之间经过指定的时间,就像使用 sleep 方法一样。但是,请注意,即使使用“固定速率”,当旧的执行尚未完成时,新的执行也不会开始。 It’s documentation说:“如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。

进一步注意,您仍然必须像我的代码示例中那样捕获异常,否则一旦抛出未捕获的异常,执行器将取消计划任务。

关于java - 如何在无限循环中替换 Thread.sleep() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25139753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com