在业务场景中,InterruptException发生多次,一些是在执行业务代码之前发生的,有些是在执行业务代码之后发生的。如何处理InterruptException让我很困惑。
1. preBusiness代码
try {
semaphore.acquire();
} catch (InterruptedException e) {
// do something
}
resObj = caller.stepTry();
semaphore.release();latch.await()**,** service.take().get() postBusiness代码
callable.setCountParam(JdkThreadCountBO.buildByLatch(latch));服务=新ExecutorCompletionService<>(可调用);CountDownLatch闩锁=新CountDownLatch(大小);for (R可调用: listCall){ ExecutorCompletionService<>service.submit(可调用);}尝试{ latch.await();} catch (InterruptedException e ) { // do } CallableResultBO[] resArr =新CallableResultBOsize;for ( int i= 0;i< size;i++ ){ try { resArri = service.take().get();}InterruptedException (ExecutionException e) { //做某事}(ExecutionException e) { //做某事}
在实践中也发现了一些疑问,我仍在思考如何得出结论。线不能随意中断。即使我们为线程设置中断状态,它仍然可以获得CPU时间片。通常只有由out ()方法阻塞的线程才能立即接收到InterruptedException,因此在睡眠中断任务的情况下,可以使用try-catch跳出任务。在其他情况下,需要通过判断线程状态来确定任务是否需要跳出(Thread.interrupted()方法)。
另外,经同步方法修改的代码在接收中断信号后不会立即中断。ReentrantLock锁控件的同步代码可以被InterruptException中断。发布于 2018-10-03 09:07:41
一般情况下,建议您执行以下操作:
void methodThatWaits()
{
try
{
Thread.sleep( 1000 );
}
catch( InterruptedException e )
{
//e.printStackTrace();
Thread.currentThread().interrupt();
}
}所以,不,Thread.currentThread().interrupt();不是多余的。
这被称为Java Thread.currentThread().interrupt成语,并在实践中详细解释了它,第7.1.3章。在“有效的Java”中也提到过,您可以在这里阅读一段摘录:Google有效的Java -搜索java成语线程中断中断
发布于 2018-10-04 01:38:18
所有的java.util.concurrent类都统一使用中断,以指示接收线程应该结束它的操作和终止。在我看来,在编写使用这些类的代码时,遵循同样的指导原则才是有意义的。
当有东西抛出InterruptedException时,该线程的中断标志将被清除。调用Thread.currentThread().interrupt会将标志还原为以前的值。
对于教程中的玩具示例来说,恢复标记似乎很愚蠢,因为它位于run方法末尾的catch块中,而且线程无论如何都是立即终止的。关键是,在线程中可能有很多层的事情发生,您可能有一个可运行的任务提交到线程池,其中该任务正在与阻塞队列交谈等等,每个参与者都需要知道是否发生中断,以便他们都能到达一个停止点并优雅地完成。如果其中任何一个在没有恢复标志的情况下吃了InterruptedException,可能有人会错过有关中断的消息,线程将继续工作,并且您的应用程序可能不会完全退出。
不干净利落地完成可能意味着:
对于如何处理InterruptedException: java.util.concurrent中的同步器倾向于让它被抛出。你是否这样做取决于你需要做些什么来完成这件事。线程取消是自愿的,这样您就可以确保任务得到可靠的清理。
https://stackoverflow.com/questions/52622554
复制相似问题