Java 中的 InterruptedException 处理

2023-12-20

以下处理方式有什么区别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你应该(必须!)捕获异常。在这种情况下,有两件事需要牢记在心:

    1. 有人打断了你的话题。有人可能渴望取消操作,优雅地终止程序,或者其他什么。你应该对那个人有礼貌,然后立即从你的方法中返回。

    2. 虽然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(使用前将#替换为@)

Java 中的 InterruptedException 处理 的相关文章

随机推荐

  • uint 数据类型的 ODP .NET 参数问题

    从本机 NET oracle 数据提供程序更新到 Oracle ODP NET 后 我遇到了以下问题 我有一个存储过程 它是包的一部分 它接受 32 个参数 除了一个指定为 OUT 参数之外 全部为 IN 参数 无论如何 这是我遇到的问题
  • Android Gcm 接收器/Gcm 侦听器服务在接收时强制应用程序到前台

    我在 Android 最低 SDK 15 上实现 GCM 时遇到了问题 我完全能够接收来自 GCM 的推送通知 并且我的GcmListenerService实施已发挥作用onMessageReceived 打回来 但我的问题是 每当一个或另
  • 如何在 Spring IoC XML 配置中从 web.xml 获取显示名称

    准确地说 我怎样才能得到的值
  • 我可以将 UIToolbar 项目居中吗?

    我正在 UIToolbar 上放置一个标签 根据此提示 将 UILabel 添加到 UIToolbar https stackoverflow com questions 333441 adding a uilabel to a uitoo
  • 使用 ACCOUNT_FORMS 覆盖 Django allauth 登录表单

    我已经用简单的设置变量覆盖了注册表单ACCOUNT SIGNUP FORM CLASS但要覆盖您需要使用的登录表单ACCOUNT FORMS login yourapp forms LoginForm 我有我想要的表单 并且它可以通过 Cr
  • Java对象的内存分配过程的步骤

    当一个类实例化以下对象时 内存中会发生什么 public class SomeObject private String strSomeProperty public SomeObject String strSomeProperty th
  • 如何区分USB设备类型?

    读完后这个问题 https stackoverflow com questions 68749 working with usb devices in net关于使用 USB 设备 我想知道操作系统使用什么方法来区分 USB 设备类型 例如
  • 重新映射键的热键不会触发热字符串

    我有一个热键和热字符串似乎不能一起工作 9 ob0 left 1 为了提供一些上下文 在代码的一部分中 我将所有符号重新映射到它们下面的数字 反之亦然 所以9打印括号 后来 我放置了一个热字符串 该热字符串将在左括号后键入右括号 然后将光标
  • 如何制作具有最小高度的可扩展div

    如果我有一个高度 100 和宽度 100 的div 它的背景颜色将主要取决于浏览器的高度和宽度 但是 如果该 div 内的内容动态增长 则该 div 将不会根据内容扩展 文本将重叠并流过该 div 另一方面 如果我将 min height
  • 将“任何 CPU/首选 32 位”设为 VS 中的默认构建设置背后的基本原理

    假设在 x64 Windows 机器上使用最新版本的 Visual Studio 和 C 并分配大量数据 果然 当使用默认构建设置进行编译时 如下图所示为 VS 2019 Preview 2 1 当进程达到 4 GB 时 您将耗尽用户虚拟地
  • 多线程性能超越核心

    如果我有一个启动的进程X线程数量 是否会有性能增益X高于数量CPU核心 假设所有线程都同步工作 没有对存储 网络的异步调用 例如 如果我有两个核心CPU 我会减慢应用程序启动 3 个以上持续工作线程的速度吗 这实际上取决于您的代码的作用 它
  • gitignore 不忽略文件夹

    在我的项目的根目录中我有一个foo文件夹 在 的里面foo文件夹我有一个bar文件夹 我想忽略对我的内部所有文件的所有更改bar文件夹 我的里面有这个gitignore foo bar 检查该文件夹 它存在并且包含要忽略的文件 gitign
  • 此版本的 Microsoft.AspNetCore.All 仅与 netcoreapp2.1 目标框架兼容

    当我从 2 0 升级到 NET Core 2 1 后尝试将应用程序发布到 Web 服务器时 收到以下消息 此版本的 Microsoft AspNetCore All 仅与 netcoreapp2 1 目标框架兼容 请以 netcoreapp
  • 在 DOM 元素上调用自定义方法

    我想在 DOM 元素上调用自定义方法 像这样 div div 我该如何开发这个问题 是否有必要使用jQuery 您不需要使用 jQuery 您可以使用document getElementById MyObject 获取 DOM 节点的引用
  • 加载库 193

    我正在创建一个 C CLI dll 它将加载到旧版 C 应用程序中 遗留应用程序通过传统的 LoadLibrary 调用来完成此操作 应用程序和 C CLI dll 均以 64 位模式编译 当发生 LoadLibrary 调用时 它会失败并
  • Rails 中的社交网络 - 哪个框架

    我应该使用 社区引擎 Insoshi 少爱 轨道空间 自己卷 我希望快速建立一个支持移动浏览的社交网络 虽然我熟悉 Ruby 和 Rails 但我不是专家 已经构建了一些基本的 Rails 应用程序 已经编写了一堆用于企业集成的 Ruby
  • 创建方案 .avsc Avro 时出现问题

    我在创建 avro 方案时遇到问题 下面我将放置我的方案 推特 avsc type record name twitter schema namespace com miguno avro fields name id type recor
  • 发送 X11 点击事件不适用于某些窗口

    以下代码片段在大多数情况下都有效 除了在某些窗口中 例如 在最新的 Ubuntu 下 它无法在文件资源管理器中选择文件夹 它似乎在其他地方都适用 但这个差距是巨大的 我怀疑这与我使用 XQueryPointer 的方式有关 但我已经尝试了几
  • 在 Laravel 4 中构建 SAAS 的正确方法

    好吧 大约一年前 我编写了一个网络应用程序 可以帮助为我父亲的公司组织约会 现在他 没有它就无法做生意 我决定建立一个 SAAS 订阅模式并向公众开放 它目前基于 codeigniter 和 php 构建 我认为这不太适合 SAAS 版本
  • Java 中的 InterruptedException 处理

    以下处理方式有什么区别InterruptedException 最好的方法是什么 try catch InterruptedException e Thread currentThread interrupt OR try catch In