你看到这篇文件多是由于你已经调用了一个抛出 InterruptedException 异常的方法,而且须要以某种方式处理它。java
首先,须要了解为一个方法为啥会 throws InterruptedException, 是这个方法抛出中断异常做为方法签名的一部分以及调用正在调用的方法的可能结果。所以,首先要接受一个事实,InterruptedException 是这个方法调用的彻底有效的结果。网络
如今,若是你正在调用的方法抛出此类异常,你的方法应该怎么作?能够经过考虑如下问题找出答案:线程
你正在实现的方法是否有意义抛出异常 InterruptedException?换句话说,InterruptedException 异常是不是调用你的方法是一个明智的结果?code
示例: 你的方法等待来自网络的值以完成计算并返回结果。若是阻塞网络调用抛出 InterruptedException方法没法以正常方式完成计算。你让 InterruptedException 传播。server
int computeSum(Server server) throws InterruptedException { // Any InterruptedException thrown below is propagated int a = server.getValueA(); int b = server.getValueB(); return a + b; }
throws InterruptedException
, 你应该(必须!)捕获异常。在这种状况下,如今要记住两件事:Thread.currentThread().interrupt()
.示例: 用户要求打印两个值的总和。若是没法计算总和,则打印“没法计算总和”(而且比因为一个致使程序因堆栈跟踪而崩溃要好得多 InterruptedException)。换句话说,用这个方法声明这个方法是没有意义的throws InterruptedException。接口
void printSum(Server server) { try { int sum = computeSum(server); System.out.println("Sum: " + sum); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // set interrupt flag System.out.println("Failed to compute sum"); } }
到目前为止,应该清楚的是,作这件事throw new RuntimeException(e)是一个坏主意。这对调用者来讲不太礼貌。您能够发明一个新的运行时异常,但根本缘由(某人但愿线程中止执行)可能会丢失。开发
另外一个例子:实施 Runnable
正如您可能已经发现的那样,签名 Runnable.run 不容许从新抛出 InterruptedExceptions。好吧,你声明了实现 Runnable 接口,这意味着你已声明处理可能的中断异常问题。选择不一样的接口,例如Callable则能够抛出中断异常(V call() throws Exception
),或者按照说的上面的第二种方法。get
还有一个:调用 Thread.sleep
你正在尝试读取文件,规范说你应该尝试10次,间隔1秒。调用 Thread.sleep(1000)
。因此,你须要处理 InterruptedException。对于一种方法 tryToReadFile 来讲,若是说“若是我被打断了,我没法完成尝试阅读文件的行为”这一方法很是有意义。换句话说,它对抛出的方法颇有意义InterruptedExceptions。io
String tryToReadFile(File f) throws InterruptedException { for (int i = 0; i < 10; i++) { if (f.exists()) return readFile(f); Thread.sleep(1000); } return null; }
做者:计算机科学
Andreas Lundblad,理论计算机科学博士。在Oracle开发Java平台(javac,javadoc,sjavac)工做了三年。安德烈亚斯是StackOverflow的Java标签的前10贡献者.