/**
* @param reqList
* @param localUrl
* @param type 0:摄像头抓拍
* @return
*/
public static ListcapturePic(List reqList, String localUrl, Integer type)throws ExecutionException, InterruptedException {
List> capList =new ArrayList<>();
List list =new ArrayList<>();
if (CollectionUtils.isNotEmpty(reqList)) {
for (MdCameraInfoReq req : reqList) {
String picUrl ="";
if (Consts.INT_ZERO.equals(type)) {
//开启线程
CompletableFuture future = CompletableFuture.supplyAsync(() -> {
return CapturePicUtils.capturePic(req.getIp(), req.getPort(), req.getUserName(), req.getPwd(), req.getChannel(), localUrl);
}, executorFinishWeighImgService);
//抓图线程list
capList.add(future);
}else {
picUrl = CapturePicUtils.captureNvrPic(req, localUrl);
}
if (StringUtils.isNotBlank(picUrl)) {
list.add(picUrl);
}
}
}
List captures =new ArrayList<>();
CompletableFuture completableFuture = CompletableFuture.allOf(capList.toArray(new CompletableFuture[capList.size()]));
//阻塞,直到所有任务结束
completableFuture.join();
CompletableFuture> captureList = completableFuture.thenApply(returnFuture -> {
capList.forEach(future -> {
try {
if (Objects.nonNull(future.get(5, TimeUnit.SECONDS))) {
captures.add(future.get(5, TimeUnit.SECONDS));
}else {
log.error("获取数据超时");
}
}catch (InterruptedException e) {
log.error("终端异常:{}", e);
}catch (ExecutionException e) {
log.error("capturePic执行异常:{}", e);
}catch (TimeoutException e) {
log.error("capturePic超时:{}", e);
}
});
return captures;
});
List baseList = captureList.get().stream().collect(Collectors.toList());
return baseList;
}
CompletableFuture多任务执行
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 什么是Future 接口 很多场景下,我们想去获取线程运行的结果,而通常使用execute方法去提交任务是无法获得...
- 1.业务背景 存在如下的业务需求:对于一个批任务,包含多个子任务taskId,在多线程并发执行时,如果出现一个子任...
- 对于的使用可以参照这篇文章:https://blog.csdn.net/jianjun200607/article...