等待没有尝试捕获[重复]

Posted

技术标签:

【中文标题】等待没有尝试捕获[重复]【英文标题】: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 谢谢你这对我帮助最大 【参考方案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);
        
    

它奏效了。谢谢那个人

【讨论】:

以上是关于等待没有尝试捕获[重复]的主要内容,如果未能解决你的问题,请参考以下文章

异步 - 等待 JavaScript:无法从错误对象中捕获错误详细信息 [重复]

尝试/最终没有捕获和返回值[重复]

java nextInt() 尝试多次捕获重复输出

Jquery ajax没有捕获404 [重复]

setTimeout()没有等待[重复]

setTimeout()没有等待[重复]