java并发工具包-CyclicBarrier

1. 作用: 各自任务完成之后, 互相等待;所有任务完成之后, 才能继续执行.

/**
 * CyclicBarrier:
 * 1. 各自任务完成之后, 互相等待;
 * 2. 所有任务完成之后, 才能继续执行.
 */
public class CyclicBarrierDemo1 {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Thread(() -> { // 当任务都执行完成时, 回调此方法.
            System.out.println("All finished!");
        }));

        new Thread(() -> {            
        	System.out.println("T1 in...");
            try {                
            	TimeUnit.SECONDS.sleep(1);
                cyclicBarrier.await();
                System.out.println("T1 finished.");
            } catch (InterruptedException e) {                
            	e.printStackTrace();
            } catch (BrokenBarrierException e) {                
            	e.printStackTrace();
            }        
       }, "T1").start();

        new Thread(() -> {            
        	System.out.println("T2 in...");
            try {                
            	TimeUnit.SECONDS.sleep(3);
                cyclicBarrier.await();
                System.out.println("T2 finished.");
            } catch (InterruptedException e) {                
            	e.printStackTrace();
            } catch (BrokenBarrierException e) {                
            	e.printStackTrace();
            }        
        }, "T2").start();
    }
 }

2. CountDownLatch和CyclicBarrier的区别

  1. countDownLatch不能reset; CyclicBarrier可以reset;所以可以循环使用。
  2. countDownLatch线程之间互不关心;CyclicBarrier线程必须等到同一个共同点才能执行某个操作。

3. CyclicBarrier的构造函数

  1. 默认只传入一个整型的wait数量;
  2. 还可以使用CyclicBarrier(int num, Runnable action):当任务执行完成时, 回调此Action。
public class CyclicBarrierReback implements Runnable {

    private CyclicBarrier barrier = new CyclicBarrier(4, this);

    public static void main(String[] args) {        
    	new CyclicBarrierReback().barrier();
        System.out.println("Main done!");
    }
    
    /**
     * 执行结果:
     *  Main done!
     *  pool-1-thread-1 done!
     *  pool-1-thread-2 done!
     *  pool-1-thread-3 done!
     *  pool-1-thread-4 done!
     *  所有任务都执行完成啦
     */
    private void barrier() {        
    ExecutorService executorService = Executors.newFixedThreadPool(4);
        IntStream.range(0, 4).forEach(item -> {            
        executorService.execute(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + " done!");
                    barrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {                    e.printStackTrace();
                }            });
        });
    }
    
    @Override
    public void run() {        
    System.out.println("所有任务都执行完成啦");
    }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值