进程切换
- 指令切换
- 映射表切换
线程切换仅仅指令切换
阻塞与恢复线程
使用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都应该立刻结束自身线程;