【问题标题】:Wait without try-catch [duplicate]等待没有尝试捕获[重复]
【发布时间】:2021-06-10 18:36:03
【问题描述】:

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

但它似乎没有工作。谁能帮帮我?

【问题讨论】:

  • 不需要创建TimeUnit的实例。 SECONDS 是一个静态字段,因此您可以直接将其称为 TimeUnit.SECONDS。另外,如果不想使用try-catch,可以public static void main(String[] args) throws InterruptedException
  • 您好!您为什么要尝试将每个循环延迟一秒?您是否有需要每秒运行一次的任务?还是您在等待某事完成?你的目标是什么?
  • 你为什么不想要一个 try/catch?
  • @k314159 谢谢你这对我帮助最大

标签: java delay wait


【解决方案1】:

在考虑了一段时间后,我确实同意 Thread.sleep 显然是将主线程暂停在循环中的直接方式。

但是,在其他可能不同的用例中,因为它会暂停一个线程,同时该线程可以做其他事情。 Here 你有一个关于 Timer vs 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 功能。

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

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

【讨论】:

  • 事实上,这个答案可能对 OP 非常有用,因为我怀疑它是 X-Y problem。计时器任务可能比循环等待更适合。
【解决方案2】:

最直接的方法是创建一个方法。

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
}

【讨论】:

  • 忽略 IntereuptedException 绝不是一个好主意。至少重新设置中断标志
  • 为了睡眠而这样做是很常见的,几乎到了地道的地步。
【解决方案3】:

你可以使用Thread.sleep(TIME_FOR_DELAY)线来延迟但你必须把它放在try-catch块内

try{
   //TODO before wait

   Thread.sleep(TIME_FOR_DELAY);

   //TODO after wait
}catch(InterruptedException e){
   // 
}

【讨论】:

    【解决方案4】:

    有人说我应该这样做

    import java.util.concurrent.TimeUnit;
    
    public class program {
        public static void main(String[] args) throws InterruptedException {
            while (true) {
                TimeUnit.SECONDS.sleep(1);
            }
        }
    }
    

    它奏效了。谢谢那个人

    【讨论】:

      猜你喜欢
      • 2021-05-05
      • 2018-04-20
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 2019-10-20
      • 2020-08-06
      • 2020-12-16
      • 1970-01-01
      相关资源
      最近更新 更多