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(); } }