阻塞方法与InterruptedException

什么是阻塞方法?为什么会抛出InterruptedException?

一般方法的完成只取决于它所要做的事情,以及是否有足够多可用的计算资源(CPU 周期和内存)。

而阻塞方法的完成还取决于一些外部的事件,例如计时器到期,I/O 完成,或者另一个线程的动作(释放一个锁,设置一个标志,或者将一个任务放在一个工作队列中)。

这就导致一个问题,阻塞方法等不到所等的事件就无法终止

因此令阻塞方法可取消就非常有用。例如:Thread.sleep()/thread.interrupt() 和 Object.wait()/thread.interrupt() 支持的中断机制就是一种取消机制,当一个线程请求另一个线程停止它正在做的事情,便抛出 InterruptedException

 

 

线程中断后发生什么?

首先:每个线程都有一个与之相关联的 Boolean 属性,用于表示线程的中断状态,中断状态初始时为 false

当另一个线程通过调用 Thread.interrupt() 中断一个线程时,会出现以下两种情况之一:

1. 如果那个线程在执行一个低级可中断阻塞方法,例如 Thread.sleep()、 Thread.join() 或 Object.wait(),那么它将改变状态,取消阻塞并抛出InterruptedException

2. 其他情况, interrupt() 只是设置线程的中断状态

那么对于第二种情况应该如何处理?

 

可以在被中断线程中运行的代码中轮询中断状态,看看它是否被请求停止正在做的事情。

中断状态可以通过 Thread.isInterrupted() 来读取,并且可以通过一个名为 Thread.interrupted() 的操作读取和清除。

因此,中断只是一种协作机制。当一个线程中断另一个线程时,被中断的线程不一定要立即停止正在做的事情。相反,中断是礼貌地请求另一个线程在它愿意并且方便的时候停止它正在做的事情

有些方法,例如 Thread.sleep(),会很认真地对待这样的请求,但每个方法不是一定要对中断作出响应。

简单来说,我要你中断,你答不答应,随便。。

 

转载于:https://www.cnblogs.com/yanze/p/10071075.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值