Java中关于CountDownLatch的使用

CyclicBarrier工具类主要是控制多个线程的一起执行,演示程序:

import java.util.Random;
import java.util.concurrent.CountDownLatch;
/**
* 
* CyclicBarrier和CountDownLatch功能类似,都可以用作在所有线程都做好准备(比如赛跑:
* 每一个运动员可以认为是一个线程,只有当所有运动员做好准备才能鸣枪开始跑)之后一起触发运行。 <br>
* <br>
* 但是也有区别:<br>
* 1:CountDownLatch(初始值为线程个数)需要每当一个线程准备好之后,调用一下countDown方法,告诉CountDownLatch又有一个线程已经完成准备,当CountDownLatch值为0时候则触发所有线程一起执行<br>
* 2:CyclicBarrier(初始值为线程个数)需要每当一个线程准备好之后运行时候会阻塞在await处,当所有线程都阻塞在await处时候,即可触发所有线程执行。(CyclicBarrier:可以循环使用,每当触发完毕一次之后还可以
* 再次使用该CyclicBarrier的实例对象)
*/
public class CountDownLatchDemo {

public static void main(String[] args) throws Exception {

CountDownLatch c = new CountDownLatch(3);
Thread t1 = newThread("t1", c);
Thread t2 = newThread("t2", c);
Thread t3 = newThread("t3", c);
t1.start();
t2.start();
t3.start();

System.out.println("线程启动完毕!");

// 下面工作模拟线程的一些自资源初始化

// 模拟线程1资源初始化
int time = new Random().nextInt(5);
System.out.println(" sleep " + time + "秒 。");
Thread.sleep(time * 1000);
c.countDown(); //到此线程1初始化完毕

// 模拟线程2资源初始化
time = new Random().nextInt(5);
System.out.println(" sleep " + time + "秒 。");
Thread.sleep(time * 1000);
c.countDown();//到此线程2初始化完毕
// 模拟线程3资源初始化
time = new Random().nextInt(5);
System.out.println(" sleep " + time + "秒 。");
Thread.sleep(time * 1000);
c.countDown();//到此线程3初始化完毕

// 所有资源都准备完毕,触发三个线程执行

}

public static Thread newThread(final String threadName, final CountDownLatch c) {

return new Thread(new Runnable() {

@Override
public void run() {
try {

c.await();
System.out.println(threadName + " is running .");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}, threadName);
}

}

 

posted @ 2017-10-11 22:15  bf378  阅读(271)  评论(0编辑  收藏  举报