以下处理方式有什么区别InterruptedException
?最好的方法是什么?
try{
//...
} catch(InterruptedException e) {
Thread.currentThread().interrupt();
}
OR
try{
//...
} catch(InterruptedException e) {
throw new RuntimeException(e);
}
编辑:我还想知道这两者在哪些场景中使用。
以下处理 InterruptedException 的方式有什么区别?最好的方法是什么?
您可能会问这个问题,因为您调用了一个抛出异常的方法InterruptedException
.
首先,你应该看到throws InterruptedException
其含义:方法签名的一部分以及调用您正在调用的方法的可能结果。因此,首先要接受这样一个事实:InterruptedException
是方法调用的完全有效的结果。
现在,如果您调用的方法抛出此类异常,应该做什么your方法呢?您可以通过思考以下问题来找出答案:
该方法有意义吗you正在实施抛出一个InterruptedException
?换句话说,是一个InterruptedException
调用时的合理结果your method?
-
If yes, then throws InterruptedException
应该是一部分your方法签名,并且您应该让异常传播(即根本不捕获它)。
Example:您的方法等待来自网络的值来完成计算并返回结果。如果阻塞网络调用抛出InterruptedException
您的方法无法以正常方式完成计算。你让InterruptedException
传播。
int computeSum(Server server) throws InterruptedException {
// Any InterruptedException thrown below is propagated
int a = server.getValueA();
int b = server.getValueB();
return a + b;
}
-
If no,那么你不应该声明你的方法throws InterruptedException
你应该(必须!)捕获异常。在这种情况下,有两件事需要牢记在心:
有人打断了你的话题。有人可能渴望取消操作,优雅地终止程序,或者其他什么。你应该对那个人有礼貌,然后立即从你的方法中返回。
虽然your方法可以在出现以下情况时设法产生合理的返回值InterruptedException
线程被中断的事实可能仍然很重要。特别是,调用您的方法的代码可能对您的方法执行期间是否发生中断感兴趣。因此,您应该通过设置中断标志来记录发生中断的事实:Thread.currentThread().interrupt()
Example:用户要求打印两个值的总和。印刷 ”Failed to compute sum
如果无法计算总和,则“是可以接受的(并且比让程序由于堆栈跟踪而崩溃要好得多)InterruptedException
)。换句话说,它确实not声明这个方法是有意义的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
. Well, you签署实施Runnable
, 意思就是you签约处理可能的情况InterruptedExceptions
。要么选择不同的界面,例如Callable http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html,或者按照上面的第二种方法。
Calling Thread.sleep
:您正在尝试读取文件,并且规范规定您应该尝试 10 次,中间间隔 1 秒。你打电话Thread.sleep(1000)
。所以,你需要处理InterruptedException
。对于诸如tryToReadFile
这么说是完全有道理的,“如果我被打断,我将无法完成尝试读取文件的操作”。换句话说,抛出异常的方法是完全有意义的InterruptedExceptions
.
String tryToReadFile(File f) throws InterruptedException {
for (int i = 0; i < 10; i++) {
if (f.exists())
return readFile(f);
Thread.sleep(1000);
}
return null;
}
这篇文章已被重写为一篇文章here http://programming.guide/java/handling-interrupted-exceptions.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)