LockSupport的park方法和unpark方法
1.park
调用方法一般为:LockSupport.park();//当前线程阻塞
2.unpark
调用方法一般为: LockSupport.unpark(w1);//唤醒当前线程
3.调用顺序
当线程先调用了unpark方法后,该线许可为true,当线程进入到park,判断为true,继续运行
4.多次调用
多次调用unpark方法和调用一次unpark方法效果一样,因为在源码里面都是直接将_counter赋值为1,而不是加1。简单说就是:线程A连续调用两次LockSupport.unpark(B)方法唤醒线程B,然后线程B调用两次LockSupport.park()方法, 线程B依旧会被阻塞。因为两次unpark调用效果跟一次调用一样,只能让线程B的第一次调用park方法不被阻塞,第二次调用依旧会阻塞
5.interrupt相应标志位对park不阻塞
public class LockPark {
private static class WorK extends Thread{
private String name;
public WorK(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(this.name+"===run begin");
try {
Thread.sleep(1000);
System.out.println(this.name+"==阻塞中===");
LockSupport.park();
LockSupport.park();
/* if(Thread.currentThread().isInterrupted()){
System.out.println(this.name+"==被中断");
}*/
System.out.println(this.name+"==工作===");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]){
WorK w1 = new WorK("w1");
w1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
w1.interrupt();
}
}
两次park被中断,继续运行