美文网首页
park unpark 原理与应用

park unpark 原理与应用

作者: 抬头挺胸才算活着 | 来源:发表于2020-06-02 23:37 被阅读0次

    原理有点像二值信号量

    _counter=0的时候调用park

    无力抵挡伤害,只好阻塞


    线程阻塞的时候调用unpark

    补血,但是为了救活,很快被消耗


    应用

    Park在写的时候要拿到线程,然后进行操作,线程多的话可能需要将线程放在数组里面;
    需要等待同步的需要先调用park等待;

    • 顺序控制
    /**
     * @program: offer
     * @description:
     * @author: liyuecheng
     * @create: 2020-06-02 23:33
     **/
    public class OrderControlUsingPark {
        private static boolean hasPrint1;
    
        public static void main(String[] args) {
            Thread print1Thread;
            Thread print2Thread;
    
            print2Thread = new Thread(() -> {
                LockSupport.park();
                System.out.println("print2");
            });
    
            print1Thread = new Thread(() -> {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("print1");
                hasPrint1 = true;
                LockSupport.unpark(print2Thread);
            });
    
            print2Thread.start();
            print1Thread.start();
        }
    }
    
    • 同步控制
    public class JiaoTiShuChuUsingPark {
        private static Thread[] threads;
    
        private static void print(String string) {
            for (int i = 0; i < 5; i++) {
                LockSupport.park();
                System.out.println(string);
                LockSupport.unpark(nextThread());
            }
        }
    
        private static Thread nextThread(){
            Thread current = Thread.currentThread();
            int index = 0;
            for (int i = 0; i < threads.length; i++) {
                if(threads[i] == current) {
                    index = i;
                    break;
                }
            }
    
            if(index < threads.length - 1) {
                return threads[index+1];
            } else {
                return threads[0];
            }
        }
    
        private static void start() {
            for (Thread thread : threads) {
                thread.start();
            }
            LockSupport.unpark(threads[0]);
        }
    
        public static void main(String[] args) {
            Thread thread1 = new Thread(() -> {
                print("a");
            }, "a-thread");
    
            Thread thread2 = new Thread(() -> {
                print("b");
            }, "b-thread");
    
            Thread thread3 = new Thread(() -> {
                print("c");
            }, "c-thread");
    
            threads = new Thread[]{thread1, thread2, thread3};
            start();
        }
    
    }
    

    相关文章

      网友评论

          本文标题:park unpark 原理与应用

          本文链接:https://www.haomeiwen.com/subject/ahkmzhtx.html