问题描述
我正在开发一个永远运行的 Java 程序,但我不知道如何在不使用“try catch”的情况下将每个循环延迟一秒钟。我试过了
import java.util.concurrent.TimeUnit;
public class program {
public static void main(String[] args) {
TimeUnit wait = new TimeUnit();
while (true) {
wait.SECONDS.sleep(1);
}
}
}
但它似乎不起作用。有人可以帮我吗?
解决方法
在考虑了一段时间后,我确实同意 Thread.sleep 显然是在循环中停止主线程的直接方法。
不过,在其他可能不同的用例中,因为它会暂停一个可以在此期间执行其他操作的线程。 Here 您可以讨论 Timer 与 Thread.sleep,如果您有兴趣,here 另一个不太全面的答案可以作为重复项通过。
public static void sleep(int someDelay) {
try {
Thread.sleep(someDelay);
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
对于要求更高的场景,ScheduledThreadPoolExecutor
是您的朋友。
ScheduledExecutorService executor = Executors.newScheduledThreadPool(poolSize);
executor.schedule(() -> {
// doSmthg
},12,TimeUnit.HOURS);
另一种方法是 Timer/Timertask,它现在通常是 discouraged(感谢 @rkosegi 指出这一点)支持 ScheduledThreadPoolExecutor。池大小为 1 模拟计时器/计时器任务功能。
另一方面,Timer/Timertask 对于单线程场景中的大量小任务具有优势“实现说明:此类可扩展到大量并发计划任务(数千个应该没有问题)。在内部,它使用一个二叉堆来表示它的任务队列,所以调度一个任务的成本是 O(log n),其中 n 是并发调度的任务数。",其中 ScheduledExecutorService 使用一个 BlockingQueue。
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// do smthg;
}
},someDelay);
,
最直接的方法是创建一个方法。
public static void sleep(int delay) {
try {
TimeUnit.SECONDS.sleep(delay);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
现在只需在需要睡觉时调用该方法即可。
for (int i = 0; i < 10; i++ ) {
System.out.println(i);
sleep(1); // 1 second
}
,
您可以使用 Thread.sleep(TIME_FOR_DELAY)
行延迟但您必须将其放在 try-catch
块中
try{
//TODO before wait
Thread.sleep(TIME_FOR_DELAY);
//TODO after wait
}catch(InterruptedException e){
//
}
,
有人说我应该这样做
import java.util.concurrent.TimeUnit;
public class program {
public static void main(String[] args) throws InterruptedException {
while (true) {
TimeUnit.SECONDS.sleep(1);
}
}
}
它奏效了。谢谢那个人