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塊磚!
——— 王二活幹完了!
——— 李四活幹完了!
——— 張三活幹完了!
結束,老闆開始檢查了!