BlockingQueue的InterruptedException如何处理? [复制]

Posted

技术标签:

【中文标题】BlockingQueue的InterruptedException如何处理? [复制]【英文标题】:How to handle InterruptedException of BlockingQueue? [duplicate] 【发布时间】:2016-07-28 03:35:42 【问题描述】:

我有一个与此类似的代码,它位于 Runnablerun() 方法中,并启动了该 Runnable 的多个实例,

do
        try
            String contractNum=contractNums.take();
           catch(InterruptedException e)
            logger.error(e.getMessage(), e);
        
  while(!("*".equals(contractNum)));

其中contractNums 是由多个线程共享的BlockingQueue<String>。有单独的Runnables 将元素放入此队列。

我不确定捕获InterruptedException 后的下一步,我应该通过重新抛出RuntimeException 来终止这个线程(所以我的while 循环终止)还是尝试再次从contractNum queue 中获取下一个元素并忽略InterruptedException?

我不确定InterruptedException 是否被视为线程终止或将其保持在while 循环中的致命条件。

请提出建议。

【问题讨论】:

【参考方案1】:

这取决于。是否有故意中断线程的地方,例如告诉它完成(例如在关闭期间)?如果没有,您只需要处理可能会唤醒线程的虚假中断。如果您不希望处理受到影响,请忽略它们。它们绝对不是致命异常,您不需要记录它们(尤其是作为错误)。

【讨论】:

谢谢。不,没有故意中断。 那么你就不需要对他们采取任何特殊的行动了。【参考方案2】:

7.1.2 中断政策

就像任务应该有取消政策一样,线程也应该有 中断政策。中断策略决定线程如何 解释一个中断请求——当一个中断请求时它做什么(如果有的话) 检测到,哪些工作单元被认为是原子的 中断,以及它对中断的反应速度。最多 明智的中断策略是某种形式的线程级或服务 关卡取消:尽可能快地退出,如果 必要的,并可能通知某个拥有实体该线程 正在退出。可以建立其他中断策略, 例如暂停或恢复服务,但线程或线程池 非标准中断策略可能需要限制为 在了解政策的情况下编写的任务。

7.1.3 应对中断

如前所述,当您调用可中断的阻塞方法时 比如 Thread.sleep 或者 BlockingQueue.put ,有两个实用的 处理 InterruptedException 的策略:

• 传播异常(可能在某些特定于任务的清理之后), 使您的方法也成为可中断的阻塞方法;或

• 恢复中断状态,以便代码在调用上更高 堆栈可以处理它。

Java Concurrency in Practice第七章。

特别是在您的代码中,您需要确保如果线程被中断,您的应用程序逻辑不会被破坏。 捕获您的中断异常确实更好。如何处理它取决于您,只需尝试确保您不会破坏应用程序逻辑。

【讨论】:

感谢您引用该书。在第 143 - 144 页上,描述了我的场景,并建议我只需要在线程即将完成时在外部 finally 块中调用 Thread.currentThread.interrupt() 一次 - 无论抛出此异常的次数如何。在内部捕获中,我应该忽略异常并重试队列中的take() 元素。

以上是关于BlockingQueue的InterruptedException如何处理? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

interrupted啥意思

interrupt, isInterrupted, interrupted

java interrupted与isInterrupted方法

interrupted()

interrupted是啥意思

线程停止(stop() interrupt() interrupted() isInterrupted())