我有一个类似于此的代码,它位于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循环中的致命条件。
请建议。
答案 0 :(得分:3)
7.1.2中断政策
正如任务应该有取消策略一样,线程应该有 中断政策。中断策略确定线程的方式 解释中断请求 - 当一个中断请求做什么(如果有的话) 检测到哪些工作单元被认为是原子的 中断,以及它对中断的反应速度。最多 合理的中断策略是某种形式的线程级别或服务 - 等级取消:尽可能快地退出,清理如果 必要的,并且可能通知一些拥有实体的线程 正在退出。可以建立其他中断策略, 例如暂停或恢复服务,但线程或线程池 非标准中断政策可能需要限制 在了解政策的情况下编写的任务。
7.1.3响应中断
如前所述,当你调用可中断的阻塞方法时 比如Thread.sleep或BlockingQueue.put,有两个实用的 处理InterruptedException的策略:
•传播异常(可能在某些特定于任务的清理之后), 使你的方法成为可中断的阻塞方法;或
•恢复中断状态,使代码在通话时更高 堆栈可以处理它。
Java Concurrency in Practice第7章
特别是在您的代码中,您需要确保如果线程被中断,您的应用程序逻辑就不会被破坏。 抓住你的中断异常确实更好。如何使用它取决于您只是尝试确保您不会破坏应用程序逻辑。
答案 1 :(得分:1)
这取决于。是否存在故意中断线程的地方,例如告诉它完成(例如在关机期间)?如果没有,您只需要处理可能唤醒线程的虚假中断。如果您不希望影响处理,请忽略它们。他们完全没有致命的例外,你不需要记录它们(特别是作为错误)。