这样应该就清楚一点了,对于CountDownLatch来说,重点是那个“一个线程”, 是它在等待, 而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。而对于CyclicBarrier来说,重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。
package com.lala.shop;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* 这里演示了一个例子:五个人一同去买 衬衫、裤子、鞋子。
* 所有人必须先全部买完衬衫,然后才能去买裤子,全部买完裤子之后,在去买鞋子,全部买完鞋子之后,事情执行完成
*/
public class CyclicBarrierDemo
{
public static void main(String[] args)
{
CyclicBarrier cb = new CyclicBarrier(5, new Runnable(){
public void run()
{
System.out.println("人已经到齐,准备下一步...");
}
});
ExecutorService runner = Executors.newFixedThreadPool(5);
runner.submit(new Shopping("李大嘴", cb));
runner.submit(new Shopping("白展堂", cb));
runner.submit(new Shopping("郭芙蓉", cb));
runner.submit(new Shopping("佟湘玉", cb));
runner.submit(new Shopping("吕秀才", cb));
runner.shutdown();
}
}
class Shopping implements Runnable
{
private String user;
private CyclicBarrier cb;
public Shopping(String user, CyclicBarrier cb)
{
this.user = user;
this.cb = cb;
}
public void run()
{
try
{
long shirtTime = getRandomTime();
TimeUnit.SECONDS.sleep(shirtTime);
System.out.println(user + "买完衬衫,花了时间:" + shirtTime);
cb.await();
long pantsTime = getRandomTime();
TimeUnit.SECONDS.sleep(pantsTime);
System.out.println(user + "买完裤子,花了时间:" + pantsTime);
cb.await();
long shoseTime = getRandomTime();
TimeUnit.SECONDS.sleep(shoseTime);
System.out.println(user + "买完鞋子,花了时间:" + shoseTime);
cb.await();
System.out.println(user + "东西已经买齐了,回家");
} catch (InterruptedException | BrokenBarrierException e)
{
e.printStackTrace();
}
}
private long getRandomTime()
{
return new Random().nextInt(9) + 1;
}
}输出结果为:
吕秀才买完衬衫,花了时间:1
白展堂买完衬衫,花了时间:1
佟湘玉买完衬衫,花了时间:3
李大嘴买完衬衫,花了时间:8
郭芙蓉买完衬衫,花了时间:9
人已经到齐,准备下一步...
白展堂买完裤子,花了时间:4
佟湘玉买完裤子,花了时间:4
吕秀才买完裤子,花了时间:5
郭芙蓉买完裤子,花了时间:8
李大嘴买完裤子,花了时间:9
人已经到齐,准备下一步...
吕秀才买完鞋子,花了时间:1
白展堂买完鞋子,花了时间:2
佟湘玉买完鞋子,花了时间:7
郭芙蓉买完鞋子,花了时间:8
李大嘴买完鞋子,花了时间:8
人已经到齐,准备下一步...
李大嘴东西已经买齐了,回家
吕秀才东西已经买齐了,回家
白展堂东西已经买齐了,回家
郭芙蓉东西已经买齐了,回家
佟湘玉东西已经买齐了,回家
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/mn960mn/article/details/46659905