有没有一种简单的方法调用sleep并传播异常?

4
我想调用 Thread.sleep 方法,并且如果确实抛出了 InterruptException 异常,则将其传播。
虚构的语法:
Interruptibles.sleep(1000);

这相当于

try {
    Thread.sleep(1000);
} catch (InterruptException e) {
    throw Throwables.propagate(e);
}

常用库(如guava、apache commons等)中是否有类似的功能?


10
不抓它怎么样? - Henry
2
@Henry,用已检查的异常污染整个源代码?不,谢谢你。 - HBase
2
+1 是为了在整个源代码中引入受检异常。所有的Java内置并发库都有其原因。 - Louis Wasserman
2个回答

9

将RuntimeException包装起来可能会在后续过程中带来痛苦。 这是一个复杂的话题,我建议阅读Java并发实践中相关章节,以充分了解您的选项。
Guava提供了sleepUninterruptibly,该方法实现了其中描述的标准惯用语之一。


阅读了JCIP中相关的部分后,我仍然不明白其中的要点。你能给我更多的指引吗? - HBase

4

你可以这样做。

try {
    Thread.sleep(1000);
} catch (InterruptException e) {
    Thread.currentThread().interrupt();
}

或者

try {
    Thread.sleep(1000);
} catch (InterruptException e) {
    Thread.currentThread().stop(e);
}

但通常最好让异常“上浮”到可以正确处理它的地方。您的IDE可以通过为您填写所需的代码来简化此过程。


2
阅读http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html以获取更多关于此的信息。感谢Louis提供此链接。 - JustinKSU
1
+1 推荐阅读《Java理论与实践:如何处理InterruptedException》。我还建议阅读http://www.javaspecialists.eu/archive/Issue146.html和http://www.javaspecialists.eu/archive/Issue056.html。 - superfav
1
Thread.stop()已经被弃用。文档指出:“这个方法本质上是不安全的。” - O.C.
@OrcunC 如果从另一个线程调用,它本质上是不安全的,因为你不知道代码中会在哪里被调用。如果在同一线程中调用它,你就知道它被调用的确切位置。http://vanillajava.blogspot.co.uk/2011/06/threadstop-really-stop-thread.html#!/2011/06/threadstop-really-stop-thread.html - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接