使用 JAVA 进行多道编程时,除了通过 wait/notify 对线程进行阻塞/唤醒外,我们还可以使用 LockSupport 工具类来阻塞和唤醒线程。
比如:
Thread threadTest = new Thread( () -> { System.out.println("thread start!"); LockSupport.park(); System.out.println("thread weakup!"); } ); threadTest.start(); Thread.sleep(100); System.out.println(" from main thread"); LockSupport.unpark(threadTest);
执行结果:
与 wait/notify 相比,park/unpark 方法更贴近操作系统层面的阻塞与唤醒线程。park/unpark 没有基于对象锁的上层判断逻辑,更直接的通过系统调用来操作线程,当然在系统调用之上还是做了一些小封装。与 wait/notify 相比:
park
不需要获取某个对象的锁park
不会抛出InterruptedException
异常,所以需要在park
之后自行判断中断状态,然后做额外的处理。就像 sleep ,notify 唤醒后,jvm 会帮助我们检查一次是否有 interrupt 信号,其原理之前做过解析 https://www.cnblogs.com/niuyourou/p/12392942.html ,将检查 interrupt 信号的逻辑放在阻塞线程的逻辑之后,一旦被唤醒,首先执行检查 interrupt 信号的逻辑,检查完后退出 sleep/wait 方法,程序继续向下执行。而 park / unpark 并没有提供类似的机制,如果需要我们应自己在 park 方法后加入检查 interrupt 信号的逻辑。
原文:https://www.cnblogs.com/niuyourou/p/12715775.html