java如何捕获InterruptedException错误

java如何捕获InterruptedException错误

小编给大家分享一下java如何捕获InterruptedException错误,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

捕获InterruptedException错误

java如何捕获InterruptedException错误

请检查下面的代码片段:

publicclassTaskimplementsRunnable{privatefinalBlockingQueuequeue=...;@Overridepublicvoidrun(){while(!Thread.currentThread().isInterrupted()){Stringresult=getOrDefault(()->queue.poll(1L,TimeUnit.MINUTES),"default");//dosmthwiththeresult}}TgetOrDefault(Callablesupplier,TdefaultValue){try{returnsupplier.call();}catch(Exceptione){logger.error("Gotexceptionwhileretrievingvalue.",e);returndefaultValue;}}}

代码的问题是,在等待队列中的新元素时,是不可能终止线程的,因为中断的标志永远不会被恢复:

1.运行代码的线程被中断。
2.BlockingQueue # poll()方法抛出InterruptedException异常,并清除了中断的标志。
3.while中的循环条件 (!Thread.currentThread().isInterrupted())的判断是true,因为标记已被清除。

为了防止这种行为,当一个方法被显式抛出(通过声明抛出InterruptedException)或隐式抛出(通过声明/抛出一个原始异常)时,总是捕获InterruptedException异常,并恢复中断的标志。

TgetOrDefault(Callablesupplier,TdefaultValue){try{returnsupplier.call();}catch(InterruptedExceptione){logger.error("Gotinterruptedwhileretrievingvalue.",e);Thread.currentThread().interrupt();returndefaultValue;}catch(Exceptione){logger.error("Gotexceptionwhileretrievingvalue.",e);returndefaultValue;}}

以上是“java如何捕获InterruptedException错误”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2022-03-19 21:13:41
收藏
分享
海报
0 条评论
29
上一篇:服务器中如何使用特定的执行程序来阻止操作 下一篇:怎么用limma包进行芯片数据差异分析
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码