CountDownLatch是一个类似计数器一样的东西。
CountDownLatch允许一个或者多个线程等待其他线程完成操作。
上篇文章我们提到的CyclicBarrier类提供一个多个线程可见的统一的屏障,等到指定数目的线程到达屏障时,屏障才会消失,而CountDownLatch类有点类似,但是又有点不同。
先看一个CountDownLatch的Demo:
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchDemo
{
public static void main(String[] args)
{
ExecutorService pool = Executors.newCachedThreadPool();
CountDownLatch player = new CountDownLatch(4);// 用来控制裁判员的行为的标尺。
CountDownLatch referee = new CountDownLatch(1);// 裁判员发号的手枪
for (int i = 0; i < 4; i++)
{
Runnable runnable = new Runnable()
{
@Override
public void run()
{
try
{
// TODO Auto-generated method stub
System.out.println("运动员" + Thread.currentThread().getName() + "已经准备好,等待裁判枪响");
referee.await();
System.out.println("运动员接受命令正在加速...");
Thread.sleep((long) (Math.random() * 10000));
System.out.println("运动员" + Thread.currentThread().getName() + "到达终点");
player.countDown(); // 显然都4个运动员(线程)都执行了这一句(模拟到达终点),裁判员才开始得到比赛结果。
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
pool.execute(runnable);
}
try
{
Thread.sleep(3000);
System.out.println("裁判员即将发布命令...");
referee.countDown();
System.out.println("裁判员已经发布命令,等待比赛结果...");
player.await();
System.out.println("得到比赛结果:运动员均到达终点");
} catch (Exception e)
{
e.printStackTrace();
}
pool.shutdown();
}
}
程序运行结果:
运动员pool-1-thread-3已经准备好,等待裁判枪响
运动员pool-1-thread-4已经准备好,等待裁判枪响
运动员pool-1-thread-1已经准备好,等待裁判枪响
运动员pool-1-thread-2已经准备好,等待裁判枪响
裁判员即将发布命令...
裁判员已经发布命令,等待比赛结果...
运动员接受命令正在加速...
运动员接受命令正在加速...
运动员接受命令正在加速...
运动员接受命令正在加速...
运动员pool-1-thread-1到达终点
运动员pool-1-thread-3到达终点
运动员pool-1-thread-2到达终点
运动员pool-1-thread-4到达终点
得到比赛结果:运动员均到达终点