线程状态变化

thread-status.png

thread-lifecycle.png

进程切换

  • 指令切换
  • 映射表切换

线程切换仅仅指令切换

阻塞与恢复线程

使用wait,notify来实现等待唤醒功能至少有两个缺点:

1.由上面的例子可知,wait和notify都是Object中的方法,在调用这两个方法前必须先获得锁对象,这限制了其使用场合:只能在同步代码块中。
2.另一个缺点可能上面的例子不太明显,当对象的等待队列中有多个线程时,notify只能随机选择一个线程唤醒,无法唤醒指定的线程。

LockSupport比Object的wait/notify有两大优势:
LockSupport不需要在同步代码块里 。所以线程间也不需要维护一个共享的同步对象了,实现了线程间的解耦。
unpark函数可以先于park调用,所以不需要担心线程间的执行的先后顺序。

各个线程状态下调用interrupt

  • RUNNABLE状态: interrupt()只是会设置线程的中断标志位,没有任何其它作用
  • WAITING/TIMED_WAITING状态: interrupt()对线程对象调用interrupt()会使得该线程抛出InterruptedException
    (抛出异常后,中断标志位会被清空(线程的中断标志位会由true重置为false,因为线程为了处理异常已经重新处于就绪状态。))
  • BLOCKED状态:interrupt()只是会设置线程的中断标志位,线程依然会处于BLOCKED状态
  • NEW/TERMINATE:interrupt()对它没有任何效果,中断标志位也不会被设置

对目标线程调用interrupt()方法可以请求中断一个线程,目标线程通过检测isInterrupted()标志获取自身是否已中断。如果目标线程处于等待状态,该线程会捕获到InterruptedException;

目标线程检测到isInterrupted()为true或者捕获了InterruptedException都应该立刻结束自身线程;