zoukankan      html  css  js  c++  java
  • CountDownLatch的简单实现

    1.

    @Data
    public abstract class BaseLatch {
        private int limit;
        protected int running;
    
        BaseLatch(int limit) {
            this.limit = limit;
            running = limit;
        }
    
        public abstract void await() throws InterruptedException;
    
        public abstract void await(long ms) throws InterruptedException, TimeoutException;
    
        public abstract void countDown();
    }
    
    class CountDownLatch extends BaseLatch {
    
        public CountDownLatch(int limit) {
            super(limit);
        }
    
        @Override
        public void await() throws InterruptedException {
            synchronized (this) {
                while (this.running > 0) {
                    this.wait();
                }
            }
        }
    
        @Override
        public void await(long ms) throws InterruptedException, TimeoutException {
            Assert.isTrue(ms > 0, "不允许小于0");
            final long endTime = System.currentTimeMillis() + ms;
            synchronized (this) {
                while (this.running > 0) {
                    long balanceTime = endTime - System.currentTimeMillis();
                    if (balanceTime <= 0) {
                        throw new TimeoutException();
                    }
                    this.wait(balanceTime);
                }
            }
        }
    
        @Override
        public void countDown() {
            synchronized (this) {
                if (this.running <= 0) {
                    throw new IllegalStateException("");
                }
                this.running--;
                this.notifyAll();
            }
        }
    }
    
    class LatchTest {
        public static void main(String[] args) throws InterruptedException {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
            Work<Integer>[] works = new Work[2];
            BaseLatch latch = new CountDownLatch(works.length);
            for (int i = 0; i < works.length; i++) {
                works[i] = new Work<Integer>(latch);
                new Thread(works[i]).start();
            }
            try {
                latch.await(5000);
            } catch (TimeoutException ex) {
    
            }
            for (int i = 0; i < works.length; i++) {
                System.out.println(works[i].getResult());
            }
            stopWatch.stop();
            System.out.println("共消耗时间:" + stopWatch.getTotalTimeSeconds() + "秒");
        }
    }
    
    class Work<T> extends Thread {
        private BaseLatch latch;
        private T result;
    
        public Work(BaseLatch latch) {
            this.latch = latch;
        }
    
        @Override
        public void run() {
            try {
                Random random = new Random();
                int ms = random.nextInt(10) + 1;
                Thread.sleep(1000 * ms);
                this.result = (T) (Object) ms;
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                latch.countDown();
            }
        }
    
        public T getResult() {
            return result;
        }
    }

     2.可能的输出如下

    null
    2
    共消耗时间:5.012秒
  • 相关阅读:
    第十三周课程总结
    第十二周课程总结
    第十一周课程总结
    C语言||作业01
    C语言寒假大作战03
    C语言寒假大作战4
    C语言寒假大作战02
    C语言寒假大作战01
    C语言I作业12—学期总结
    第一周作业
  • 原文地址:https://www.cnblogs.com/zhshlimi/p/10375442.html
Copyright © 2011-2022 走看看