栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Java中处理InterruptedException

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Java中处理InterruptedException

以下处理

InterruptedException
的方式之间有什么区别?最好的方法是什么?

你可能会问这个问题,因为你已经调用了

throw
方法
InterruptedException

首先,你应该

throws InterruptedException
了解它的含义:方法签名的一部分以及调用你正在调用的方法的可能结果。因此,首先要包含一个事实,即
an 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;}

如果为no,则不应使用声明你的方法,

throws InterruptedException
并且(必须!)应捕获异常。现在,在这种情况下要牢记两件事:

  1. 有人打断了你的线程。有人可能想取消该操作,优雅地终止程序或执行其他操作。你应该对那个人彬彬有礼,并毫不费力地从方法中返回。
  2. 即使在线程被中断的情况下,即使你的方法可以设法产生合理的返回值,InterruptedException也可能仍然很重要。特别是,调用你的方法的代码可能会对执行方法期间是否发生中断感兴趣。因此,你应该通过设置中断标志来记录发生中断的事实:
    Thread.currentThread().interrupt()

示例:用户要求打印两个值的总和。

Failed to compute sum
如果无法计算总和,则打印“ ”是可以接受的(并且比使程序由于栈跟踪而崩溃更容易
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
,这意味着你已经注册了对“可能”的处理InterruptedExceptions。选择其他界面(例如)
Callable
,或按照上面的第二种方法。

呼叫

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;}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/431867.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号