Java中断异常InterruptedException的正确处理方式

更新时间:2023-05-12 13:53:05 阅读: 评论:0

Java中断异常InterruptedException的正确处理⽅式
你看到这篇⽂件可能是因为你已经调⽤了⼀个抛出 InterruptedException 异常的⽅法,并且需要以某种⽅式处理它。
⾸先,需要了解为⼀个⽅法为啥会 throws InterruptedException, 是这个⽅法抛出中断异常作为⽅法签名的⼀部分以及调⽤正在调⽤的⽅法的可能结果。因此,⾸先要接受⼀个事实,InterruptedException 是这个⽅法调⽤的完全有效的结果。
现在,如果你正在调⽤的⽅法抛出此类异常,你的⽅法应该怎么做?可以通过考虑以下问题找出答案:
你正在实现的⽅法是否有意义抛出异常 InterruptedException?换句话说,InterruptedException 异常是否是调⽤你的⽅法是⼀个明智的结果?
如果是,那么 throws InterruptedException 应当成为你的⽅法签名,你应该让异常传播(即不捕获该异常的话)。
⽰例:你的⽅法等待来⾃⽹络的值以完成计算并返回结果。如果阻塞⽹络调⽤抛出 InterruptedException⽅法⽆法以正常⽅式完成计算。你让 InterruptedException 传播。
int computeSum(Server rver) throws InterruptedException {
// Any InterruptedException thrown below is propagated
int a = ValueA();
int b = ValueB();
return a + b;
}
如果不是,那么你不应该声明你的⽅法throws InterruptedException, 你应该(必须!)捕获异常。在这种情况下,现在要记住两件事:
1. 有⼈打断了你的线程。这个⼈可能急于取消操作,优雅地终⽌程序,或者其他什么。你应该对那个⼈保持礼貌并且不⽤再费⼒地从你
的⽅法中返回。
2. 即使你的⽅法可以设法让出现 InterruptedException 异常时, 即在线程被中断的情况下, 产⽣合理的返回值,线程被中断过这件事仍然很
重要。特别是,调⽤⽅法的代码可能会对执⾏⽅法期间是否发⽣中断感兴趣。您应该通过设置中断标志来记录发⽣中断的事实:即需要在 catch ⾥调⽤Thread.currentThread().interrupt() .
⽰例:⽤户要求打印两个值的总和。如果⽆法计算总和,则打印“⽆法计算总和”(并且⽐由于⼀个导致程序因堆栈跟踪⽽崩溃要好得多InterruptedException)。换句话说,⽤这个⽅法声明这个⽅法是没有意义的throws InterruptedException。
void printSum(Server rver) {
try {
int sum = computeSum(rver);
System.out.println("Sum: " + sum);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();  // t interrupt flag
System.out.println("Failed to compute sum");
}
}
到⽬前为⽌,应该清楚的是,做这件事throw new RuntimeException(e)是⼀个坏主意。这对调⽤者来说不太礼貌。您可以发明⼀个新的运⾏时异常,但根本原因(某⼈希望线程停⽌执⾏)可能会丢失。
另⼀个例⼦:实施 Runnable
正如您可能已经发现的那样,签名 Runnable.run 不允许重新抛出 InterruptedExceptions。好吧,你声明了实现 Runnable 接⼝,这意味着你已声明处理可能的中断异常问题。选择不同的接⼝,例如Callable则可以抛出中断异常(V call() throws Exception),或者按照说的上⾯的第⼆种⽅法。
还有⼀个:调⽤ 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;
}

本文发布于:2023-05-12 13:53:05,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/888209.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:中断   可能   应该   抛出   线程   计算
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图