等待而不尝试捕获

Wait without try-catch

我正在开发一个永远运行的 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 you have a discussion of Timer vs Thread.sleep, if you're interested and 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 功能。

另一方面,Timer/Timertask在单线程场景中对大量小任务有优势“实施说明:这class可扩展到大量并发scheduled tasks (thousands should present present no problem). 在内部,它使用二进制堆来表示其任务队列,因此调度任务的成本是 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);
        }
    }
}

它奏效了。谢谢那个人