首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理InterruptedException的最佳实践

处理InterruptedException的最佳实践
EN

Stack Overflow用户
提问于 2018-10-03 08:08:51
回答 2查看 6.8K关注 0票数 5

在业务场景中,InterruptException发生多次,一些是在执行业务代码之前发生的,有些是在执行业务代码之后发生的。如何处理InterruptException让我很困惑。

1. preBusiness代码

代码语言:javascript
复制
        try {
            semaphore.acquire();
        } catch (InterruptedException e) {
           // do something
        }
        resObj = caller.stepTry();
        semaphore.release();
  1. 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中断。
EN

回答 2

Stack Overflow用户

发布于 2018-10-03 09:07:41

一般情况下,建议您执行以下操作:

代码语言:javascript
复制
    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成语线程中断中断

票数 7
EN

Stack Overflow用户

发布于 2018-10-04 01:38:18

所有的java.util.concurrent类都统一使用中断,以指示接收线程应该结束它的操作和终止。在我看来,在编写使用这些类的代码时,遵循同样的指导原则才是有意义的。

当有东西抛出InterruptedException时,该线程的中断标志将被清除。调用Thread.currentThread().interrupt会将标志还原为以前的值。

对于教程中的玩具示例来说,恢复标记似乎很愚蠢,因为它位于run方法末尾的catch块中,而且线程无论如何都是立即终止的。关键是,在线程中可能有很多层的事情发生,您可能有一个可运行的任务提交到线程池,其中该任务正在与阻塞队列交谈等等,每个参与者都需要知道是否发生中断,以便他们都能到达一个停止点并优雅地完成。如果其中任何一个在没有恢复标志的情况下吃了InterruptedException,可能有人会错过有关中断的消息,线程将继续工作,并且您的应用程序可能不会完全退出。

不干净利落地完成可能意味着:

  • 结果可能会有半成品挂在外面干.
  • 线程是GC根,因此可能会出现内存泄漏。
  • 任何保持活动的非守护进程线程都会阻止JVM退出。

对于如何处理InterruptedException: java.util.concurrent中的同步器倾向于让它被抛出。你是否这样做取决于你需要做些什么来完成这件事。线程取消是自愿的,这样您就可以确保任务得到可靠的清理。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52622554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档