验证:interrupt()会调用unpark():
如果调用interrupt()方法,则颁发一次许可证,通过清空中断标记,可以预测park()第一次会消耗许可证,不会成功,第2次成功park(),控制台只输出第一次park()
验证:当isInterrupted中断标记为true的时候,park都不会成功
Thread test = new Thread(() -> {
Thread.currentThread().interrupt();
LockSupport.park();
System.out.println("第1次park");//park不住,还会执行
Thread.interrupted();//为什么aqs要用interrupted():设置isInterrupted为false,aqs用unpark唤醒,后续才能park住,
LockSupport.park();
System.out.println("第2次park");
if (Thread.currentThread().isInterrupted()) {
System.out.println("通过interrupt唤醒");
} else {
System.out.println("通过unpark唤醒");
}
LockSupport.park();//打断标记为true,无法park;false,可以Park
System.out.println("第3次park");
LockSupport.park();
System.out.println("再来一次park试试,也park不住呀" + Thread.currentThread().isInterrupted());
});
test.start();
Thread.sleep(1000);
LockSupport.unpark(test);//对应false,可以park的情况,aqs用unpark唤醒后
// test.interrupt();//对应true,无法park的情况,aqs selfInterrupt后,无法再次park住
小结:aqs使用interrupted()清空打断标记的目的是,如果后续被unpark()唤醒,但没获取到节点,能够park()住