《张孝祥Java多线程与并发库高级应用视频教程》里面关于CyclicBarrier同步工具的应用中,当运行线程改为5个时,运行结果出现不在同一地点就出发了,谁能解释一下?
- package cn.itcast.heima2;
- import java.util.concurrent.CyclicBarrier;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class CyclicBarrierTest {
- public static void main(String[] args) {
- ExecutorService service = Executors.newCachedThreadPool();
- final CyclicBarrier cb = new CyclicBarrier(3);
- for (int i = 0; i < 5; i++) {
- Runnable runnable = new Runnable() {
- public void run() {
- try {
- Thread.sleep((long) (Math.random() * 1000));
- System.out.println("线程"
- + Thread.currentThread().getName()
- + "即将到达集合地点1,当前已有"
- + (cb.getNumberWaiting() + 1)
- + "个已经到达,"
- + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊"
- : "正在等候"));
- cb.await();
- Thread.sleep((long) (Math.random() * 1000));
- System.out.println("线程"
- + Thread.currentThread().getName()
- + "即将到达集合地点2,当前已有"
- + (cb.getNumberWaiting() + 1)
- + "个已经到达,"
- + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊"
- : "正在等候"));
- cb.await();
- Thread.sleep((long) (Math.random() * 1000));
- System.out.println("线程"
- + Thread.currentThread().getName()
- + "即将到达集合地点3,当前已有"
- + (cb.getNumberWaiting() + 1)
- + "个已经到达,"
- + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊"
- : "正在等候"));
- cb.await();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- };
- service.execute(runnable);
- }
- service.shutdown();
- }
- }
- /*结果:
- 线程pool-1-thread-1即将到达集合地点1,当前已有1个已经到达,正在等候
- 线程pool-1-thread-5即将到达集合地点1,当前已有2个已经到达,正在等候
- 线程pool-1-thread-3即将到达集合地点1,当前已有3个已经到达,都到齐了,继续走啊
- 线程pool-1-thread-4即将到达集合地点1,当前已有1个已经到达,正在等候
- 线程pool-1-thread-2即将到达集合地点1,当前已有2个已经到达,正在等候
- 线程pool-1-thread-3即将到达集合地点2,当前已有3个已经到达,都到齐了,继续走啊
- 线程pool-1-thread-5即将到达集合地点2,当前已有1个已经到达,正在等候
- 线程pool-1-thread-3即将到达集合地点3,当前已有2个已经到达,正在等候
- 线程pool-1-thread-2即将到达集合地点2,当前已有3个已经到达,都到齐了,继续走啊
- 线程pool-1-thread-5即将到达集合地点3,当前已有1个已经到达,正在等候
- 线程pool-1-thread-1即将到达集合地点2,当前已有2个已经到达,正在等候
- 线程pool-1-thread-4即将到达集合地点2,当前已有3个已经到达,都到齐了,继续走啊
- 线程pool-1-thread-4即将到达集合地点3,当前已有1个已经到达,正在等候
- 线程pool-1-thread-2即将到达集合地点3,当前已有2个已经到达,正在等候
- 线程pool-1-thread-1即将到达集合地点3,当前已有3个已经到达,都到齐了,继续走啊*/
复制代码 |
|