Interrupted()方法的运用情况的疑问?

来源:5-14 interrupt状态

陈三子

2020-02-15

Interrupted()方法的运用情况。

线程B对线程A发起interrupt()请求,此时A可以分为运行中和阻塞两种状态。

1. A在运行中。这个时候A的中断标志位为true,A线程可以自己决定理不理睬这个中断请求。比如在while中加上!Thread.currentThread().isInterrupted()用来响应中断,也可以不予理睬,继续执行。

2. A在阻塞中。导致A阻塞的方式有很多种,比如A线程run方法里让A本身sleep,或者A线程的run方法有阻塞队列。但是凡是在run方法里有导致A可能阻塞的代码,Java语法都会要求对阻塞时暂停线程的异常InterruptedException进行处理。比如这是在while中发生了“线程阻塞时遭interrupt异常--InterruptedException”,这时我们可以在异常捕获中将异常传递下去,也可以将异常标志位置为false。这时的选择还是在于A线程。

 

所以interrupt请求不仅能中断运行中的程序。也可以通过异常处理阻塞时的异常。

 

比较好奇的是,为什么java设计者将运行时的线程A设置为中断时,A会抛出异常。如果不这样设计也没问题把?是不是因为如果设计为阻塞时候不抛出异常,若线程长时间阻塞会没办法响应中断标志?这样interrupt就变成了volatile方法了?


写回答

1回答

悟空

2020-02-16

是的,你说的对。如果不抛出异常,那就无法及时响应中断,相当于中断失效了。


0
0

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程