Java 提升之CountDownLatch
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
主要方法
public CountDownLatch(int count);
public void countDown();
public void await() throws InterruptedException
构造方法参数指定了计数的次数
countDown方法,当前线程调用此方法,则计数减一
awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0
package com.study.thread.concurrent;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author draem0507
* @TODO 学下countdownLatch
* @version 0.1
* @create 2012 15:03:28
*
*/
public class CountDownLatchTest {
/**
* <p>
* CountDownLatch类是一个同步计数器,构造时传入int参数,
* </p>
* <p>
* 该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,
* </p>
* <p>
* 计数器大于0 时,await()方法会阻塞程序继续执行
* </p>
*/
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(3);
Worker worker1 = new Worker("小明", countDownLatch);
Worker worker2 = new Worker("小红", countDownLatch);
Worker worker3 = new Worker("小强", countDownLatch);
Boss boss = new Boss(countDownLatch);
ExecutorService service = Executors.newCachedThreadPool();
service.execute(worker1);
service.execute(worker2);
service.execute(worker3);
service.execute(boss);
service.shutdown();
}
}
class Worker implements Runnable {
private String name;
private CountDownLatch countDownLatch;
public void run() {
doWork();
try {
Thread.sleep((new Random().nextInt(10)) * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name + "-->结束干活");
countDownLatch.countDown();
}
public Worker(String name, CountDownLatch countDownLatch) {
this.name = name;
this.countDownLatch = countDownLatch;
}
private void doWork() {
System.out.println(name + "-->正在干活");
}
}
class Boss implements Runnable {
private CountDownLatch countDownLatch;
public Boss(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
public void run() {
System.out.println("老板正在等待验工");
try {
countDownLatch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("工人干活都结束,老板开始验工");
}
}
结果:
小明-->正在干活 小红-->正在干活 老板正在等待验工 小强-->正在干活 小强-->结束干活 小明-->结束干活 小红-->结束干活 工人干活都结束,老板开始验工
不一定都按上述结果呈现,但是最后一句话肯定是最后执行
参考:
http://www.cnblogs.com/yezhenhan/archive/2012/01/07/2315652.html
http://www.iteye.com/topic/1002652

浙公网安备 33010602011771号