假设有这么个场景: 一段程序中需要调用如下几个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<Object, Object> 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));
}
}
这样一般可以缩减调用时间