java并发学习之阻塞方法与中断方法
一.阻塞方法
1.线程会阻塞或暂停执行的原因有很多种,比如:等待I/O操作结束,等待获得一个锁,等待从Thread.sleep中醒来,或者等待另一个线程的计算结果。
2.当线程阻塞时,它通常只是被挂起而不是结束,此时的线程会处于阻塞的一种状态,这要视情况而定。
3.阻塞操作与普通操作的差别在于,被阻塞的线程必须等待某个不受它控制的事件发生后才能继续执行,比如,等待I/O操作的完成,而在I/O操作期间其时间是不确定的。当这个事件发生时,线程会被置回为可运行状态,并可以再次被调度执行。
4.BlockingQueue的put和take等方法会抛出受检查异常InterruptedException,这与类库中的其他方法的做法相同,例如Thread.sleep,当此方法抛出这个异常时,就表示该方法是一个阻塞方法,如果这个方法被中断,那么它将努力提前结束阻塞状态。
二.中断方法
1.Thread提供了interrupt方法,此方法用于中断线程或者查询线程是否已经被中断。
2.每个线程都有一个boolean类型的属性,表示线程的中断状态,当程序中断线程时这个状态将被重新设置。
3.中断是一种协作机制,一个线程不能强制其他线程停止正在执行的操作而去执行其他的操作。
4.方法对中断请求的响应度越高,就越容易及时取消那些执行时间很长的操作。
5.当在代码中调用了一个将抛出InterruptedException异常的方法时,这时我们的方法也就变成了一个阻塞方法,并且必须要处理对中断的响应。对于库代码来说,有两种基本选择: