等待而不尝试捕获

Alp*_*pha 0 java delay wait

我正在开发一个永远运行的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用。谁能帮我?

gur*_*oso 5

经过一段时间的考虑后,我确实同意 Thread.sleep 显然是使主线程陷入循环的直接方法。

不过,在其他用例中可能会有所不同,因为它会阻止一个可以同时执行其他操作的线程。如果您有兴趣,这里讨论了 Timer 与 Thread.sleep,这里还有一个不太全面的答案,可以作为重复的问题传递。

public static void sleep(int someDelay) {
   try {
      Thread.sleep(someDelay);
   } 
   catch (InterruptedException e) {
      Thread.currentThread().interrupt();
   }
}
Run Code Online (Sandbox Code Playgroud)

对于要求更高的场景,ScheduledThreadPoolExecutor它是您的朋友。

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(poolSize);
    executor.schedule(() -> {
        // doSmthg
    }, 12, TimeUnit.HOURS);
Run Code Online (Sandbox Code Playgroud)

另一种方法是 Timer/Timertask,现在通常不鼓励使用它(感谢 @rkosegi 指出这一点),而支持 ScheduledThreadPoolExecutor。池大小 1 模仿 Timer/Timertask 功能。

另一方面,Timer/Timertask 在单线程场景中处理大量小任务时具有优势“实现说明:此类可扩展到大量并发计划任务(数千个应该没有问题)。在内部,它使用二进制heap 来表示它的任务队列,因此调度一个任务的成本是 O(log n),其中 n 是并发调度任务的数量。 ”,其中 ScheduledExecutorService 使用了 BlockingQueue。

new Timer().schedule(new TimerTask() {
        @Override
        public void run() {
            // do smthg;
        }
    }, someDelay);
Run Code Online (Sandbox Code Playgroud)