关于Volatile标志位和Interrupt标志位的疑惑。。

来源:5-13 分析源码

陈三子

2020-02-15

http://img1.sycdn.imooc.com/szimg/5e47f3b009912a6b13140656.jpg

http://img1.sycdn.imooc.com/szimg/5e47f3b009d966c613660658.jpg

关于Volatile标志位和Interrupt标志位的疑惑。。

    图1是用Volatile标志位来实现中断,很明显会失败。我把加入阻塞队列(容量为10)前后都进行都打印,可不可以理解为当队列已近满了时代码中的58步已经执行了(数值时4600),而线程阻塞在了59步。此时消费者不需要消费了,在main方法中将Volatile标志位置为true,因为线程时阻塞在while里的,所以会一直阻塞下去。。。那如果此时我们人为将队列清空,此时是不是就可以将4600塞到队列中?也能进行下一次while判断了。此时标志位为true,while没有进入,线程运行结束。我想表达的是当阻塞线程满后再放东西就会阻塞到代码59行,此时若不阻塞了后代码就继续执行59行,而不是从头执行while。

    图2是用interrupt实现的,能成功。但是相同的,当线程阻塞在59行后,此时执行感知到interrupt中断,这里我们不对异常处理,那下次是从while开始执行。这是为啥?

    

    有点乱哈,不知道老师能不能看明白。。。我自己想了下,是不是这个意思。。。

第一种情况,当阻塞线程阻塞时,线程相当于断点一样停止在了59行。然后队列经过消费后,这个阻塞结束,代码依次往下执行。

第二种情况,当阻塞线程阻塞时,线程相当于断点一样停止在了59行。但是此时感应到了Interrupt中断,线程在阻塞情况下中断会抛出异常InterruptedException,而我们在while里对异常进行了捕获(未处理),所以相当于这次循环结束。而进行下一次循环。。。如果我们想对中断进行响应,那么需要在捕获异常时将异常传递下去。这样在while判断时就可以看到中断标记了。





写回答

1回答

悟空

2020-02-16

是的,如果认为从阻塞队列取走东西,是可以继续从59行执行的。

第二种情况,用了中断异常,发生异常就会跳到catch语句中,这是Java语法规定的,所以会直接跳到下一次while中。

0
0

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

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

2512 学习 · 939 问题

查看课程