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被中断,继续运行

发布了10 篇原创文章 · 获赞 0 · 访问量 217

猜你喜欢

转载自blog.csdn.net/u011042377/article/details/103597947