繁体   English   中英

是Thread.sleep(1000); 可靠的东西使用?

[英]Is Thread.sleep(1000); something reliable to use?

我知道Thread.sleep(1000); 可用于冻结当前线程(在示例中为1秒),但由于您需要抛出Exception我想知道它是否可以安全使用它。 我不想在程序中使用它并意外地导致问题。

使用Thread.sleep();是否“正常” Thread.sleep(); 或者有更好的方法来实现相同的结果吗?

顺便说一句,如果你想睡觉并且知道你不会使用中断,那么避免处理InterruptedExceptions的方便方法是使用Guava的Uninterruptibles,例如

Uninterruptibles.sleepUninterruptibly(1000, TimeUnit.MILLISECONDS);

如果以推荐的方式抛出一个(即重置中断状态)并避免难看的try-catch块,这将透明地处理InterruptedException。

因为你需要抛出异常,我想知道它是否安全使用它。

线程#sleep仅抛出2个异常

  • 如果参数为负,则为IllegalArgumentException
  • InterruptedException ,如果线程被中断

=>如果传递正数并且线程没有被中断,则不会有异常。

除非你从另一个线程调用theThread.interrupt() ,否则你会没事的。

编辑

看起来你想要创建一个计时器 - 在这种情况下,你可以通过使用内置机制让你的生活更简单:

Runnable r = new Runnable() {
    public void run() { runYourTaskHere(); }
};
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(r, 0, 1, TimeUnit.SECONDS);

取决于你想要做什么,我已经看到Thread.sleep被使用,它通常用于修复编程错误,因为人们认为它解决了竞争条件。 Thread.sleep必须抛出一个异常,因为Java不控制CPU(最后我检查过),所以如果CPU有错误,或者即使它没有,并提前唤醒一个线程/以某种方式中断它的程序(Java)需要一种方法来终止自身并将消息传播到堆栈中。 此外,这在很大程度上取决于你的意思“相同的结果”

这是非常安全的。 JVM已经提供了InterruptedException,以便您可以在需要时处理它(假设您希望在此线程被中断时执行额外操作)...它实际上并不意味着发生了一些不好的事情。

由于thread.sleep暂停当前​​线程一段时间(不杀死它)。 所以使用它是安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM