zoukankan      html  css  js  c++  java
  • LeetCode多线程——按序打印:多种解法

    题目链接:https://leetcode-cn.com/problems/print-in-order/

    解法1:使用synchronizedwaitnotifyAll

    class Foo {
        private int state = 1;
    
        public Foo() {}
    
        public void first(Runnable printFirst) throws InterruptedException {
            synchronized(this) {
                while (state != 1) {
                    this.wait();
                }
                printFirst.run();
                state = 2;
                this.notifyAll();
            }
        }
    
        public void second(Runnable printSecond) throws InterruptedException {
            synchronized(this) {
                while (state != 2) {
                    this.wait();
                }
                printSecond.run();
                state = 3;
                this.notifyAll();
            }
        }
    
        public void third(Runnable printThird) throws InterruptedException {
            synchronized(this) {
                while (state != 3) {
                    this.wait();
                }
                printThird.run();
                state = 1;
                this.notifyAll();
            }
        }
    }
    

    解法2:使用ReentrantLockCondition

    class Foo {
        private int state = 1;
        private Lock lock = new ReentrantLock();
        private Condition condition1 = lock.newCondition();
        private Condition condition2 = lock.newCondition();
        private Condition condition3 = lock.newCondition();
    
        public Foo() {}
    
        public void first(Runnable printFirst) throws InterruptedException {
            lock.lock();
            try {
                while (state != 1) {
                    condition1.await();
                }
                printFirst.run();
                state = 2;
                condition2.signal();
            } finally {
                lock.unlock();
            }
        }
    
        public void second(Runnable printSecond) throws InterruptedException {
            lock.lock();
            try {
                while (state != 2) {
                    condition2.await();
                }
                printSecond.run();
                state = 3;
                condition3.signal();
            } finally {
                lock.unlock();
            }
        }
    
        public void third(Runnable printThird) throws InterruptedException {
            lock.lock();
            try {
                while (state != 3) {
                    condition3.await();
                }
                printThird.run();
                state = 1;
                condition1.signal();
            } finally {
                lock.unlock();
            }
        }
    }
    

    解法3:使用Semaphore

    class Foo {
        private Semaphore s1 = new Semaphore(0);
        private Semaphore s2 = new Semaphore(0);
    
        public Foo() {}
    
        public void first(Runnable printFirst) throws InterruptedException {
            printFirst.run();
            s1.release();
        }
    
        public void second(Runnable printSecond) throws InterruptedException { 
            s1.acquire();
            printSecond.run();
            s2.release();
        }
    
        public void third(Runnable printThird) throws InterruptedException {
            s2.acquire();
            printThird.run();
        }
    }
    

    解法4:使用CountDownLatch

    class Foo {
        private CountDownLatch c1 = new CountDownLatch(1);
        private CountDownLatch c2 = new CountDownLatch(1);
    
        public Foo() {}
    
        public void first(Runnable printFirst) throws InterruptedException {
            printFirst.run();
            c1.countDown();
        }
    
        public void second(Runnable printSecond) throws InterruptedException {
            c1.await();
            printSecond.run();
            c2.countDown();
        }
    
        public void third(Runnable printThird) throws InterruptedException {
            c2.await();
            printThird.run();
        }
    }
    

    解法5:使用CyclicBarrier

    class Foo {
        CyclicBarrier b1 = new CyclicBarrier(2);
        CyclicBarrier b2 = new CyclicBarrier(2);
    
        public Foo() {}
    
        public void first(Runnable printFirst) throws InterruptedException {
            try {
                printFirst.run();
                b1.await();
            } catch (Exception e) {}
        }
    
        public void second(Runnable printSecond) throws InterruptedException {
            try {
                b1.await();
                printSecond.run();
                b2.await();
            } catch (Exception e) {}
        }
    
        public void third(Runnable printThird) throws InterruptedException {
            try {
                b2.await();
                printThird.run();
            } catch (Exception e) {}
        }
    }
    

    解法6:使用BlockingQueue

    class Foo {
        BlockingQueue<Integer> q1 = new SynchronousQueue();
        BlockingQueue<Integer> q2 = new SynchronousQueue();
    
        public Foo() {}
    
        public void first(Runnable printFirst) throws InterruptedException {
            printFirst.run();
            q1.put(100);
        }
    
        public void second(Runnable printSecond) throws InterruptedException {
            
            q1.take();
            printSecond.run();
            q2.put(200);
        }
    
        public void third(Runnable printThird) throws InterruptedException {
            
            q2.take();
            printThird.run();
        }
    }
    

    解法7:自旋

    class Foo {
        private volatile boolean flag1 = false;
        private volatile boolean flag2 = false;
    
        public Foo() {}
    
        public void first(Runnable printFirst) throws InterruptedException {
            printFirst.run();
            flag1 = true;
        }
    
        public void second(Runnable printSecond) throws InterruptedException {
            while (!flag1);
            printSecond.run();
            flag2 = true;
        }
    
        public void third(Runnable printThird) throws InterruptedException {
            while (!flag2);
            printThird.run();
        }
    }
    
  • 相关阅读:
    (15)疯狂的程序员----《绝影》
    (14)嵌入式软件开发工程师技能要求总结
    (13)碎片化阅读只会让你变得越来越愚蠢
    (12)QT中搭建opencv开发环境
    (11)git服务器的安装和配置
    (10)python学习笔记一
    (3.3)狄泰软件学院C++课程学习剖析四
    (9)Linux下gdb调试学习
    (8)Linux(客户端)和Windows(服务端)下socket通信实例
    springMVC伪静态
  • 原文地址:https://www.cnblogs.com/baiyuxuan/p/14529315.html
Copyright © 2011-2022 走看看