BlockingQueue的InterruptedException如何处理? [复制]
Posted
技术标签:
【中文标题】BlockingQueue的InterruptedException如何处理? [复制]【英文标题】:How to handle InterruptedException of BlockingQueue? [duplicate] 【发布时间】:2016-07-28 03:35:42 【问题描述】:我有一个与此类似的代码,它位于 Runnable
的 run()
方法中,并启动了该 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如何处理? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
interrupt, isInterrupted, interrupted