等待没有尝试捕获[重复]
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);
它奏效了。谢谢那个人
【讨论】:
以上是关于等待没有尝试捕获[重复]的主要内容,如果未能解决你的问题,请参考以下文章