你看到这篇文件可能是因为你已经调用了一个抛出 InterruptedException 异常的方法,并且需要以某种方式处理它。

首先,需要了解为一个方法为啥会 throws InterruptedException, 是这个方法抛出中断异常作为方法签名的一部分以及调用正在调用的方法的可能结果。因此,首先要接受一个事实,InterruptedException 是这个方法调用的完全有效的结果。

现在,如果你正在调用的方法抛出此类异常,你的方法应该怎么做?可以通过考虑以下问题找出答案:

你正在实现的方法是否有意义抛出异常 InterruptedException?换句话说,InterruptedException 异常是否是调用你的方法是一个明智的结果?

  • 如果是,那么 throws InterruptedException 应当成为你的方法签名,你应该让异常传播(即不捕获该异常的话)。

示例: 你的方法等待来自网络的值以完成计算并返回结果。如果阻塞网络调用抛出 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;
}
  • 如果不是,那么你不应该声明你的方法 throws InterruptedException, 你应该(必须!)捕获异常。在这种情况下,现在要记住两件事:
  1. 有人打断了你的线程。这个人可能急于取消操作,优雅地终止程序,或者其他什么。你应该对那个人保持礼貌并且不用再费力地从你的方法中返回。
  2. 即使你的方法可以设法让出现 InterruptedException 异常时, 即在线程被中断的情况下, 产生合理的返回值,线程被中断过这件事仍然很重要。特别是,调用方法的代码可能会对执行方法期间是否发生中断感兴趣。您应该通过设置中断标志来记录发生中断的事实:即需要在 catch 里调用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),或者按照说的上面的第二种方法。

还有一个:调用 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;
}

Java中断异常 InterruptedException 的正确处理方式的更多相关文章

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

    处理InterruptedException 这个故事可能很熟悉:你正在写一个测试程序,你需要暂停某个线程一段时间,所以你调用 Thread.sleep().然后编译器或 IDE 就会抱怨说 Inte ...

  2. Java修炼——异常的概念以及处理方式(捕获异常)

    异常概念分类 异常( Exception 也称例外)就是在程序的运行过程中 所发生的不正常的事件,它会中断正在运行的程序  所需文件找不到  网络连接不通或中断  算术运算错 (被零除-)  ...

  3. sleep方法要求处理中断异常:InterruptedException

    package seday08.thread;/*** @author xingsir * 当一个线程调用sleep方法处于阻塞状态的过程中,这个线程的中断方法interrupt被调用时,则sleep ...

  4. Java线程之 InterruptedException 异常

    Java线程之 InterruptedException 异常   当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...

  5. java 中断线程的几种方式 interrupt()

    中断 中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作.线程是死亡.还是等待新的任务或是继续运行至下一步,就取决于这个程序.虽然初次看来它可能显 ...

  6. java程序中抛出异常的两种方式,及异常抛出的顺序

    在java中,会经常遇到异常,java提供了两种抛出异常的方式. 方式一: throws ,抛出具体代码中的异常,这种方式编译器都会提示,举例: public static void main(Str ...

  7. Redis实现分布式锁的正确使用方式(java版本)

    Redis实现分布式锁的正确使用方式(java版本) 本文使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 分布式锁一般有三种实现方式: 1. 数据库乐观锁: ...

  8. Java中异常关键字throw和throws使用方式的理解

    Java中应用程序在非正常的情况下停止运行主要包含两种方式: Error 和 Exception ,像我们熟知的 OutOfMemoryError 和 IndexOutOfBoundsExceptio ...

  9. Java:异常小记

    Java:异常小记 对 Java 中的 异常 ,做一个微不足道的小小小小记 Error 和 Exception 相同点: Exception 和Error 都是继承了 Throwable 类,在 Ja ...

随机推荐

  1. Java Selenium - 元素操作 (二)

    一篇概括了常用的元素定位方法,但是找到元素还是不够的,模拟鼠标的操作,完成各个功能点的自动操作才是关键. 下面是常见的页面元素操作会涉及到的方法,不是很全,比较复杂的后面单独拿出来做案例. 一, 输入 ...

  2. 如何学Python

    如何学习Python? Python上手很容易, 基本有其他语言编程经验的人可以在1周内学会Python最基本的内容.它们包括:1.常用内置类型(int, float, bool, bytes, st ...

  3. iOS 新浪微博-5.0 首页微博列表

    首页显示微博列表,是微博的核心部分,这一章节,我们主要是显示出微博的列表. 导入第三方类库 pod 'SDWebImage', '~> 3.7.3' pod 'MJRefresh', '~> ...

  4. Web API 入门 二 媒体类型

    还是拿上面 那篇 Web API 入门 一  的那个来讲 在product类中加一个时间属性

  5. spring之拦截器

    拦截器 实现HandlerInterceptor接口:注册拦截器<mvc:inteceptors> spring和springMVC父子容器的关系 在spring整体框架的核心概念中,容器 ...

  6. shell基础:位置参数变量

    位置参数名称,作用不变.变得是传入参数. 抽象问题,大多为年长资格老师少数年轻老师,故而问的技术细节少,抽象理论知识多,比如什么是软件工程,问什么会有软件工程.有事注重的是品质,有的注重出身. 每种都 ...

  7. caffe-ssd运行create_data.sh的时候报错:SSD from caffe.proto import caffe_pb2 ImportError: No module named caffe.proto

    在用voc2007和voc2012的数据训练基于caffe的SSD模型的时候,我们需要将图片数据转换成lmdb格式,运行脚本文件是SSD源码里面提供的create_data.sh(具体位置在$CAFF ...

  8. <9>cc.Sprite组件

    1.精灵 精灵(Sprite)是Cocos系列的核心概念之一,是Cocos Creator最常用的显示图像的组件. 游戏中显示一个图片,我们就可以把这个叫做”精灵” sprite,这只是简单理解概念. ...

  9. python 数据较大 性能分析

    前提:若有一个几百M的文件需要解析,某个函数需要运行很多次(几千次),需要考虑性能问题 性能分析模块:cProfile 使用方法:cProfile.run("func()"),其中 ...

  10. 【2017-02-28】C# 冒泡排序

    冒泡排序 重复地走访过要排序的数列,一次比较两个元素的大小,如果他们的顺序错误就把他们交换过来 通过两个For循环嵌套来实现 思路——以从小到大为例 第一个for循环抽取第一个数和第二个数进行比较,如 ...