业务背景,在项目开发中,在一个方法中需要同时查询四个不同的远程接口,这个接口可以并行请求,但需要同时拿到四个接口返回的结果才能继续执行业务。很显然这种情况通过串行调用,肯定可以实现,但是这样会造成阻塞时间长,性能低。例如现在有四个方法及其调用时间:
如果串行调用,那么四个接口调用耗时:5+3+4+2 = 14s;
如果并行调用,那么四个接口调用耗时为:5s,时间节约9s
下面使用代码方式实现并行任务
1、定义业务类
public class TaskVO {
private String zgh;
private String xcx;
private String app;
private String web;
}
2、多线程并行调用
/***
* 模拟耗时操作
* @param s
* @param flag
*/
public void sleep(int s,String flag){
try {
System.out.println(flag+"------start---"+dateFormat.format(new Date()));
TimeUnit.SECONDS.sleep(s);
System.out.println(flag+"------end-----"+dateFormat.format(new Date()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void doVoidAllTask(){
TaskVO taskVO = new TaskVO();
long s = System.currentTimeMillis();
System.out.println("start------start---"+dateFormat.format(new Date())+"----"+taskVO);
CompletableFuture<Void> t1 = CompletableFuture.runAsync(() -> {
sleep(5,"t1");
taskVO.setApp("app");
});
CompletableFuture<Void> t2= CompletableFuture.runAsync(() -> {
sleep(3,"t2");
taskVO.setZgh("gzh");
});
CompletableFuture<Void> t3= CompletableFuture.runAsync(() -> {
sleep(4,"t3");
taskVO.setXcx("xcx");
});
CompletableFuture<Void> t4= CompletableFuture.runAsync(() -> {
sleep(2,"t4");
taskVO.setWeb("web");
});
CompletableFuture<Void>[] completableFutures = Stream.of(t1, t2, t3,t4).collect(Collectors.toList()).toArray(new CompletableFuture[4]);
/// t1 t2 t3 t4 全部并行执行结束时结束任务
CompletableFuture.allOf(completableFutures).join();
/// t1 t2 t3 t4 全部并行执行结束时结束任务
///CompletableFuture.allOf(completableFutures).join();
long e = System.currentTimeMillis();
System.out.println("total time :"+ (e-s));
System.out.println("end------end---"+dateFormat.format(new Date())+"----"+taskVO);
}