经常遇到InterruptedException这个异常, 不知道该如何处理

来源:9-2 并发最佳实践

搬砖战士

2018-10-03

在使用completionService, countDownLatch, semaphore等并发工具的时候, 经常与到检查型异常InterruptedException。
这个异常应该如何处理呢, 是分别try catch, 还是用throws的方式汇总的一起处理, 需要使用Thread.currentThread().interrupt();这样的结构去显示地中断线程吗?

写回答

2回答

Jimin

2018-10-03

你好,一个线程不是可以随便中断的。即使我们给线程设置了中断状态,它也还是可以获得CPU时间片的。通常只有因为sleep()方法而阻塞的线程可以立即收到InterruptedException异常,所以在sleep中断任务的情况下可以直接使用try-catch跳出任务。其它情况下,需要通过判断线程状态来判断是否需要跳出任务(Thread.interrupted()方法)。

另外,synchronized方法修饰的代码不会在收到中断信号后立即中断。ReentrantLock锁控制的同步代码可以通过InterruptException中断。

Thread.interrupted方法调用一次之后会立即清空中断状态。可以自己用变量保存状态。但这个方法目前已经用的很少了,J.U.C里提供的组件已经可以处理绝大部分的场景了

0
1
搬砖战士
非常感谢!
2018-10-11
共1条回复

搬砖战士

提问者

2018-10-05

    好像是线程有个中断状态, 允许别人用来中断自己。 同时这个中断是一个【请求】, 有的时候严格执行, 有的时候不严格执行, 要等到线程走到【中断点】再去执行。不是完全明白, 有点似懂非懂。 

    主要的困惑点, 是在于两方面。 

    1 代码中的InterruptedException最终应该如何处理, 是log一行日志, 还是转成一个runtime异常抛出去

    2 同是InterruptedException, 但有的出现在sql执行之前, 有的出现在sql执行之后。(之前:比如获取信号量), (之后:比如await, take之类的)。如果是出现在业务代码之后, SQL都已经执行完了, 该insert该update的都已经操作掉了, 这种情况下该如何处理呢。

0
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程