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错误”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!