java如何捕获InterruptedException错误
java如何捕获InterruptedException错误
小编给大家分享一下java如何捕获InterruptedException错误,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
捕获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错误”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!
推荐阅读
-
java fileinputstream中文乱码如何解决
javafileinputstream中文乱码如何解决今天小编给...
-
java实现点赞功能
-
java实现简单点赞功能
-
java实现收藏功能
-
java输入空行结束问题怎么解决
-
Java线程中常用的操作有哪些
-
java输入时怎么通过回车来结束输入
java输入时怎么通过回车来结束输入这篇文章主要介绍“java输入...
-
Java数据结构之线索化二叉树怎么实现
Java数据结构之线索化二叉树怎么实现这篇文章主要介绍“Java数...
-
Java中的泛型怎么理解
Java中的泛型怎么理解本篇内容介绍了“Java中的泛型怎么理解”...
-
Java字符串编码解码性能怎么提升
Java字符串编码解码性能怎么提升这篇“Java字符串编码解码性能...