如何处理BlockingQueue的InterruptedException?

时间:2016-04-07 10:11:03

标签: java multithreading concurrency blockingqueue

我有一个类似于此的代码,它位于run()的{​​{1}}方法内,并且Runnable的多个实例已启动,

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是否被视为线程终止或将其保留在while循环中的致命条件。

请建议。

2 个答案:

答案 0 :(得分:3)

7.1.2中断政策

  

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

7.1.3响应中断

  

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

     

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

     

•恢复中断状态,使代码在通话时更高   堆栈可以处理它。

Java Concurrency in Practice第7章

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

答案 1 :(得分:1)

这取决于。是否存在故意中断线程的地方,例如告诉它完成(例如在关机期间)?如果没有,您只需要处理可能唤醒线程的虚假中断。如果您不希望影响处理,请忽略它们。他们完全没有致命的例外,你不需要记录它们(特别是作为错误)。