CountDownLatch简单使用

 CountDownLatch介绍java

 CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,能够把它当作是一个计数器,其内部维护着一个count计数,只不过对这个计数器的操做都是原子操做,同时只能有一个线程去操做这个计数器,CountDownLatch经过构造函数传入一个初始计数值,调用者能够经过调用CounDownLatch对象的cutDown()方法,来使计数减1;若是调用对象上的await()方法,那么调用者就会一直阻塞在这里,直到别人经过cutDown方法,将计数减到0,才能够继续执行。并发


  使用场景ide

有时候会有这样的需求,多个线程同时工做,而后其中几个能够随意并发执行,但有一个线程须要等其余线程工做结束后,才能开始。举个例子,开启多个线程分块下载一个大文件,每一个线程只下载固定的一截,最后由另一个线程来拼接全部的分段,那么这时候咱们能够考虑使用CountDownLatch来控制并发。
函数



示例spa

package org.test.other;

import java.util.concurrent.CountDownLatch;

public class Sample {
    /**
     * 计数器,用来控制线程
     * 传入参数2,表示计数器计数为2
     */
    private final static CountDownLatch mCountDownLatch = new CountDownLatch(5);

    /**
     * 示例工做线程类
     */
    private static class WorkingThread extends Thread {
        private final String mThreadName;
        private final int mSleepTime;
        public WorkingThread(String name, int sleepTime) {
            mThreadName = name;
            mSleepTime = sleepTime;
        }
        
        @Override
        public void run() {
            System.out.println("[" + mThreadName + "] started!");
            try {  
                    Thread.sleep(mSleepTime);  
            } catch (InterruptedException e) {  
                    e.printStackTrace();  
            }
            System.out.println("[" + mThreadName + "] end!"); 
            mCountDownLatch.countDown();
        }
    }
    
    /**
     * 示例线程类
     */
    private static class SampleThread extends Thread {
        
        @Override
        public void run() {
            System.out.println("[SampleThread] started!");
            try {
                // 会阻塞在这里等待 mCountDownLatch 里的count变为0;
                // 也就是等待另外的WorkingThread调用countDown()
                mCountDownLatch.await();
            } catch (InterruptedException e) {
                
            }
            System.out.println("[SampleThread] end!");
        }
    }
    
    public static void main(String[] args) throws Exception {
        // 最早run SampleThread
        new SampleThread().start();
        // 运行两个工做线程
        // 工做线程1运行5秒
        new WorkingThread("WorkingThread1", 5000).start();
        // 工做线程2运行5秒
        new WorkingThread("WorkingThread2", 5000).start();
        new WorkingThread("WorkingThread3", 5000).start();
        new WorkingThread("WorkingThread4", 5000).start();
        new WorkingThread("WorkingThread5", 5000).start();
    }
}