2

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

使用“可以”Thread.sleep();还是有更好的方法来达到相同的结果?

4

5 回答 5

16

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

Uninterruptibles.sleepUninterruptibly(1000, TimeUnit.MILLISECONDS);

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

于 2013-01-07T12:33:53.950 回答
6

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

Thread#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);
于 2013-01-07T12:28:10.453 回答
0

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

于 2013-01-07T12:28:55.883 回答
0

这是完全安全的。JVM提供了InterruptedException,以便您可以在需要时处理它(假设您想在该线程被中断时做一些额外的事情)......这实际上并不意味着发生了不好的事情。

于 2013-01-07T12:29:44.383 回答
0

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

于 2013-01-07T13:17:27.907 回答