深入理解JUC:第四章:CountDownLatch倒計(jì)時(shí)器

理論:

CountDownLatch是一個(gè)非常實(shí)用的多線程控制工具類。常用的就下面幾個(gè)方法:

    CountDownLatch(int count) //實(shí)例化一個(gè)倒計(jì)數(shù)器,count指定計(jì)數(shù)個(gè)數(shù)
    countDown() // 計(jì)數(shù)減一
    await() //等待,當(dāng)計(jì)數(shù)減到0時(shí),所有線程并行執(zhí)行

未使用CountDownLatch的代碼:

    public class Demo {
     
        public static void main(String[] args) {
            for (int i = 0; i < 5; i++) {
                new Thread(()->{
                    System.out.println(Thread.currentThread().getName()+"\t 工作任務(wù)完成,離開(kāi)公司");
                },String.valueOf(i)).start();
            }
            System.out.println(Thread.currentThread().getName()+"\t 最后將公司門鎖死,離開(kāi)公司");
        }
    }

控制臺(tái):

使用CountDownLatch的代碼:

    public class Demo {
     
        public static void main(String[] args) throws Exception{
            CountDownLatch countDownLatch = new CountDownLatch(5);
            for (int i = 0; i < 5; i++) {
                new Thread(()->{
                    System.out.println(Thread.currentThread().getName()+"\t 工作任務(wù)完成,離開(kāi)公司");
                    countDownLatch.countDown();
                },String.valueOf(i)).start();
            }
            countDownLatch.await();
            System.out.println(Thread.currentThread().getName()+"\t 最后將公司門鎖死,離開(kāi)公司");
        }
    }

控制臺(tái):

案例二:

    package tst.project;
     
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
     
    public class Test {
     
        public static void main(String[] args) {
            int tasks = 3;
            final CountDownLatch latch = new CountDownLatch(tasks);
            ExecutorService executorService = Executors.newFixedThreadPool(tasks);
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("5秒完成:"+latch);
                    latch.countDown();
                }
            });
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("3秒完成:"+latch);
                    latch.countDown();
                }
            });
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("1秒完成:"+latch);
                    latch.countDown();
                }
            });
            executorService.shutdown();
            try {
                latch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

控制臺(tái):

 

結(jié)合下一章閱讀:https://blog.csdn.net/java_wxid/article/details/99170471