等待而不尝试捕获

问题描述

我正在开发一个永远运行的 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);
        }
    }
}

它奏效了。谢谢那个人