CyclicBarrier示例

原创
2016/06/01 13:47
阅读数 23

CyclicBarrier与CountDownLatch非常相似,但是不同点在于:多个线程到达“屏障”之后要阻塞线程,无法执行别的事情

package com.vincent.juc;

import java.util.Random;
import java.util.concurrent.*;

/**
 * Vincent 创建于 2016/6/1.
 */
public class CyclicBarrierDemo {
    public static void main(String[] args) throws InterruptedException {
        final CyclicBarrier cyclicBarrier=new CyclicBarrier(5);

        final Random random=new Random();


        ExecutorService threadPool = Executors.newCachedThreadPool();

        for(int i=0;i<5;i++){
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        int t = random.nextInt(10);
                        TimeUnit.SECONDS.sleep(t+1);
                        long id = Thread.currentThread().getId();
                        System.out.println("线程"+id+"执行结束");
                        cyclicBarrier.await();
                        System.out.println(id+"做别的事去了");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }


    }
}

输出:

线程16执行结束
线程14执行结束
线程12执行结束
线程13执行结束
线程15执行结束
15做别的事去了
16做别的事去了
14做别的事去了
12做别的事去了
13做别的事去了

现在我们用CountDownLatch实现上面例子:

package com.vincent.juc;

import java.util.Random;
import java.util.concurrent.*;

/**
 * Vincent 创建于 2016/6/1.
 * 利用CountDownLatch实现CyclicBarrier
 */
public class CountDownLatchDemo1 {
    public static void main(String[] args) {
        final CountDownLatch countDownLatch = new CountDownLatch(5);

        final Random random = new Random();


        ExecutorService threadPool = Executors.newCachedThreadPool();

        for (int i = 0; i < 5; i++) {
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        int t = random.nextInt(10);
                        TimeUnit.SECONDS.sleep(t + 1);
                        long id = Thread.currentThread().getId();
                        System.out.println("线程" + id + "执行结束");
                        countDownLatch.countDown();
                        countDownLatch.await();
                        System.out.println(id + "做别的事去了");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}

输出:

线程13执行结束
线程15执行结束
线程12执行结束
线程16执行结束
线程14执行结束
14做别的事去了
13做别的事去了
12做别的事去了
15做别的事去了
16做别的事去了

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部