线程阻塞
- 线程阻塞或者暂停执行的原因
- 等待I/O操作结束
- 等待获得一个锁
- 等待从Thread.sleep中醒来
- 等待另一个线程的计算结果
- 线程阻塞时的状态
- BLOCKED
- WAITING
- TIMED_WAITING
- 阻塞操作和执行时间很长的普通操作差别在于:被阻塞的线程必须等待某个不受它控制的事件发生后才能继续执行,线程被置回RUNNALBE状态,并可以再次被调度执行
线程中断
- 当某个方法抛出InterruptedException时,表示该方法是一个阻塞方法,如果这个方法被中断,那么它将努力提前结束阻塞状态
- 中断是一种协作机制:线程A中断B时,A仅仅是要求B在执行到某个可以暂停的地方停止正在执行的操作——前提是如果线程B愿意停止下来
- 如何处理调用代码抛出的InterruptedException
- 传递,最明智的策略
- 有时候无法抛出,比如代码是Runnable的一部分时,捕获InterruptedException并通过调用当前线程的interrupt方法恢复中断状态
- 不能做:捕获但不做任何响应
public class TaskRunnable implements Runnable {
BlockingQueue<Task> queue;
...
public void run() {
try {
processTask(queue.take());
} catch (InterruptedException e) {
<span class="docEmphasis">// restore interrupted status</span>
<span class="docEmphStrong">Thread.currentThread().interrupt();</span>
}
}
}