Java如何处理InterruptedException

一、概述

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

try{
 //...
} catch(InterruptedException e) { 
   Thread.currentThread().interrupt(); 
}

要么

try{
 //...
} catch(InterruptedException e) {
   throw new RuntimeException(e);
}

我也想知道这两种情况在哪些情况下使用。

二、详解

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

您可能会问这个问题,因为您已经调用了throw方法InterruptedException

首先,您应该throws InterruptedException了解它的含义:方法签名的一部分以及调用您正在调用的方法的可能结果。因此,首先要考虑一个事实,即anInterruptedException是方法调用的完全有效结果。

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

正在实现的方法抛出一个有意义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;
}

 

 

如若转载,请注明出处:https://www.javaidea.cn/article/8419.html

(0)
上一篇 2022年2月7日 上午10:03
下一篇 2022年2月7日 上午10:03

相关推荐

发表评论

您的电子邮箱地址不会被公开。