多线程之CyclicBarrier(循环障碍物)应用

假设有这么个场景: 一段程序中需要调用如下几个API:

然后将上述三个数据封装发送给Kafka

当然,单线程完全可以完成这些任务,我只是为了较好的利用例子

需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier

package com.nuoyuan.kafkademo.component;

import com.alibaba.fastjson.JSON;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author: Syliu
 * @Date: 2018/6/2 15:07
 * @Description:
 * 需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier
 *  1.需要百度faceAPI
 *  2.需要调用用户信息API
 *  3.需要调用权限API
 */
public class CyclicBarrierDemo {

    public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
        CyclicBarrier barrier = new CyclicBarrier(4);
        ExecutorService executor = Executors.newFixedThreadPool(3);
        final Map map = new HashMap<>(3);
        //1.需要百度faceAPI
        executor.submit(()->{
            map.put("获取百度API","SUCCESS");
            System.out.println("获取百度API完成");
            barrier.await();
            System.out.println("百度API顺利通过");
            return null;
        });
        //1.需要调用用户信息API
        executor.submit(()->{
            map.put("调用用户信息API","SUCCESS");
            System.out.println("调用用户信息API完成");
            barrier.await();
            System.out.println("调用用户信息API顺利通过");
            return null;
        });
        //1.需要调用权限API
        executor.submit(()->{
            map.put("调用权限API","SUCCESS");
            System.out.println("调用权限API完成");
            barrier.await();
            System.out.println("调用权限API顺利通过");
            return null;
        });
        //主线程等待
        System.out.println("主线程进入等待状态");
        barrier.await();
        executor.shutdown();
        System.out.println("主线程放行");
        System.out.println("发送卡夫卡:数据为"+ JSON.toJSONString(map));

    }
}

这样一般可以缩减调用时间



你可能感兴趣的:(多线程)