• CountDownLatch的API讲解


    1.使用executor.awaitTermination(1, TimeUnit.HOURS);

    package com.dwz.utils;
    
    import java.util.Random;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.Executor;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    
    public class CountDownLatchExample1 {
        private static Random random = new Random(System.currentTimeMillis());
        private static ExecutorService executor = Executors.newFixedThreadPool(2);
        private static final CountDownLatch countDownLatch = new CountDownLatch(11);
        
        public static void main(String[] args) throws InterruptedException {
            //(1)查询数据
            int[] data = query();
            //(2)并行处理数据
            for(int i = 0; i < data.length; i++) {
                executor.execute(new SimpleRunnable(data, i));
            }
            //(3)
            executor.shutdown();
            executor.awaitTermination(1, TimeUnit.HOURS);
            System.out.println("all of work finish done.");
        }
        
        static class SimpleRunnable implements Runnable    {
            private final int[] data;
            private final int index;
            
            public SimpleRunnable(int[] data, int index) {
                this.data = data;
                this.index = index;
            }
            
            @Override
            public void run() {
                try {
                    Thread.sleep(random.nextInt(2000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                int value = data[index];
                if(value % 2 == 0) {
                    data[index] = value * 2;
                } else {
                    data[index] = value * 10;
                }
                System.out.println(Thread.currentThread().getName() + " finished.");
            }
        }
        
        private static int[] query() {
            return new int[] {0,1,2,3,4,5,6,7,8,9,10};
        }
    }

    2.使用countDownLatch.await();

    package com.dwz.utils;
    
    import java.util.Random;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.Executor;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    
    public class CountDownLatchExample1 {
        private static Random random = new Random(System.currentTimeMillis());
        private static ExecutorService executor = Executors.newFixedThreadPool(2);
        private static final CountDownLatch countDownLatch = new CountDownLatch(11);
        
        public static void main(String[] args) throws InterruptedException {
            //(1)查询数据
            int[] data = query();
            //(2)并行处理数据
            for(int i = 0; i < data.length; i++) {
                executor.execute(new SimpleRunnable(data, i));
            }
            //(3)
            countDownLatch.await();
            System.out.println("all of work finish done.");
        }
        
        static class SimpleRunnable implements Runnable    {
            private final int[] data;
            private final int index;
            
            public SimpleRunnable(int[] data, int index) {
                this.data = data;
                this.index = index;
            }
            
            @Override
            public void run() {
                try {
                    Thread.sleep(random.nextInt(2000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                int value = data[index];
                if(value % 2 == 0) {
                    data[index] = value * 2;
                } else {
                    data[index] = value * 10;
                }
                countDownLatch.countDown();
                System.out.println(Thread.currentThread().getName() + " finished.");
            }
        }
        
        private static int[] query() {
            return new int[] {0,1,2,3,4,5,6,7,8,9,10};
        }
    }

    3.latch.await();和latch.countDown();的混合使用

    package com.dwz.utils;
    
    import java.util.concurrent.CountDownLatch;
    
    public class CountDownLatchExample2 {
        public static void main(String[] args) {
            final CountDownLatch latch = new CountDownLatch(1);
            
            new Thread() {
                @Override
                public void run() {
                    System.out.println("Do some initial work.");
                    try {
                        Thread.sleep(1000);
                        latch.await();
                        System.out.println("Do other work.");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
            
            new Thread() {
                @Override
                public void run() {
                    System.out.println("asyn prepare for some data.");
                    try {
                        Thread.sleep(2000);
                        System.out.println("data prepare done.");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        latch.countDown();
                    }
                }
            }.start();
        }
    }
  • 相关阅读:
    【总有一些东西老是忘】之——常见HTML的块级标签、内联标签
    【JS跨域取XML】之——借助AS的URLLoader
    【前端重构技能天赋】(二)——Javascript、CSS篇
    【IE大叔的嘴歪眼斜】之—— 由hasLayout引发的临床CSS Bug表
    【F12一下,看看页面里的第一行】——说说浏览器兼容性模式
    【IE大叔的杀马特审美】之——CSS盒子模型
    【前端重构技能天赋】(一)——内容篇
    【总有一些东西要弄清】——说说面试时一系列的CSS问题
    【拆了CSS照样是页面】之——HTML语义化(含H5)
    【javascript继承】之——原型链继承和类式继承
  • 原文地址:https://www.cnblogs.com/zheaven/p/13214133.html
Copyright © 2020-2023  润新知