zoukankan      html  css  js  c++  java
  • 多线程 闭锁CountDownLatch

      在下面的代码中,由于多线程并行的原因,可能主线程的耗时计算早就执行完了,而上面的线程还在打印,因此不能正确计算耗时时间。

    public class JavaDemo {
        public static void main(String[] args) throws ParseException {
    
            long begin = System.currentTimeMillis();
    
            LatchDemo ld = new LatchDemo();
    
            for (int i = 0; i < 5; i++) {
                new Thread(ld).start();
            }
    
            long end = System.currentTimeMillis();
    
            System.out.println("耗时:" + (end - begin));
    
        }
    }
    
    class LatchDemo implements Runnable {
    
        @Override
        public void run() {
    
            for (int i = 0; i < 50000; i++) {
                System.out.println(i);
            }
    
        }
    }

      引入闭锁机制,在指定个数的线程没执行完之前,不会继续执行后面的代码

    public class JavaDemo {
        public static void main(String[] args) throws ParseException {
    
            CountDownLatch latch = new CountDownLatch(5);
            LatchDemo ld = new LatchDemo(latch);
    
            long begin = System.currentTimeMillis();
            for (int i = 0; i < 5; i++) {
                new Thread(ld).start();
            }
    
            //countdown为0之前将一直等待
            try {
                latch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            long end = System.currentTimeMillis();
    
            System.out.println("耗时:" + (end - begin));
    
        }
    }
    
    class LatchDemo implements Runnable {
    
        private CountDownLatch latch;
    
        public LatchDemo(CountDownLatch latch) {
            this.latch = latch;
        }
    
        @Override
        public void run() {
            try {
                synchronized (this) {
                    for (int i = 0; i < 50000; i++) {
                        System.out.println(i);
                    }
                }
            } finally {
                latch.countDown();
            }
            
        }
    }

      正确计算耗时,控制台打印

    ......
    49997
    49998
    49999
    耗时:1262
    
    Process finished with exit code 0
  • 相关阅读:
    Oracle Hint的用法
    利用flashback transaction query新特性进行事务撤销
    存储的一些基本概念(HBA,LUN)
    SAN和NAS
    SAN (Storage Attached Network),即存储区域网络
    深入浅出谈存储之NAS是什么
    对于NAS,IP SAN以及iSCSCI SAN存储的一些认识和理解
    Oracle的体系结构
    利用360免费wifi搭建局域网让他人访问Oracle数据库
    杭电ACM id:3783
  • 原文地址:https://www.cnblogs.com/noyouth/p/12809433.html
Copyright © 2011-2022 走看看