CyclicBarrier只要有一个线程没完成,所有线程等待
CountDownLatch监听线程操作(比如初始化),等待操作完成之后,通知其他线程
//应用
public class Main {
public static void main(String[] args) throws Exception{
Map cm =new HashMap();
ExecutorService executor = Executors.newCachedThreadPool();
CountDownLatch latch = new CountDownLatch(3);
Worker w1 = new Worker(latch, "张三",cm);
Worker w2 = new Worker(latch, "李四",cm);
Worker w3 = new Worker(latch, "王二",cm);
executor.execute(w3);
executor.execute(w2);
executor.execute(w1);
System.out.println("老板正在监工......");
try {
latch.await();
} catch (InterruptedException e) {
}
System.out.println("结束,老板开始检查了!");
System.out.println("一共搬了"+cm.get("z")+"块砖,大家辛苦了。");
executor.shutdown();
}
}
//对象
public class Worker implements Runnable {
private CountDownLatch downLatch;
private String name;
private Map workedJobs;
private int jobs;
public Worker(CountDownLatch downLatch, String name,Map workedJobs) {
this.downLatch = downLatch;
this.name = name;
this.workedJobs = workedJobs;
}
public void run() {
this.doWork();
try {
TimeUnit.SECONDS.sleep(new Random().nextInt(3));
} catch (InterruptedException ie) {}
Integer wj = (Integer)workedJobs.get("z");
int sum = (wj==null?0:wj);
workedJobs.put("z", sum +=jobs);
System.out.println("--------- "+ this.name + "活干完了!");
this.downLatch.countDown();//通知我做完了
}
private void doWork() {
jobs=new Random().nextInt(10);
System.out.println(this.name + " ,搬了"+jobs+"块砖!");
}
}
结果:
老板正在监工……
李四 ,搬了5块砖!
王二 ,搬了5块砖!
张三 ,搬了7块砖!
——— 王二活干完了!
——— 李四活干完了!
——— 张三活干完了!
结束,老板开始检查了!