Java 执行器服务中是否存在吞咽中断异常?

Java 执行器服务中是否存在吞咽中断异常?,java,executorservice,interrupted-exception,Java,Executorservice,Interrupted Exception,有一篇IBM的文章。 这说明永远不要吞咽中断异常。声纳上也有同样的东西 “InterruptedException”不应被忽略 但是在Executorservice中有一个关于interruptedException的StackOverflow问题,这表明我们不应该再次设置中断。 IBM的文章很老,没有考虑现代Java并发包吗? 我们应该如何处理ExecutorService中的interruptedException?您应该在捕获interruptedException的所有位置做出决定,

有一篇IBM的文章。

这说明永远不要吞咽中断异常。声纳上也有同样的东西

“InterruptedException”不应被忽略

但是在Executorservice中有一个关于interruptedException的StackOverflow问题,这表明我们不应该再次设置中断。

IBM的文章很老,没有考虑现代Java并发包吗?
我们应该如何处理ExecutorService中的interruptedException?

您应该在捕获interruptedException的所有位置做出决定,因为这取决于您的代码的情况和重要性

对于您的任务来说,一个明智的响应是注意中断,允许优雅地取消或关闭当前线程,或者在executor中运行。在可运行程序的最外层重置
Thread.currentThread().interrupt()
没有多大意义(因为线程将在稍后退出,或者执行器正在管理该中断)


但是,如果您在任务控件下面捕获该异常,则重置
Thread.currentThread().interrupt()
可能有助于更高级别的任务正常查看和退出,但前提是他们正在检查
Thread.currentThread().isInterrupted()
在每个阶段,或您的代码传递中断异常或特定于应用程序的异常。

Hi@DuncG,如果可能,请您帮助我理解“将异常捕获到任务控件下面的调用堆栈的几层”。这到底意味着什么?当ExecutorService中发生这种情况时会发生什么情况?假设您的Runnable A是一个大循环,每次调用B。如果您将IntExc困在B中,然后退出B,而没有做任何事情告诉A这种情况,那么A将处理下一个B调用,而不是退出。因此,对于to resumes循环是否合适,这是由您自己决定的,可以通过再次使用标志或调用interrupted()来决定,也可以不做任何事情让resumes感谢@DuncG的回复。但我的问题是关于服务的。假设我们有一个可调用任务列表。添加(()->{returnprocesssublist(subList);});每个任务处理100000条记录,我们希望处理100万条记录。如果调用executorService.invokeAll(任务)时出现中断异常,我们是否应该重置Thread.currentThread().interrupt()?或者ExecutorService会处理它吗?ExecutorService会在运行下一个任务之前重置标志,因此一旦您的任务完成,下一个任务的标志将被清除。我在我的一个程序中通过添加
Thread.currentThread().interrupt()验证了它在末尾和
System.out.println(“开始/结束”+Thread.currentThread().getName()+“isInterrupted=“+Thread.currentThread().isInterrupted())以开始/结束。