使用CompletableFuture开启多线程实战教程

150 阅读1分钟

使用completableFuture开启多线程,可以直接使用stream流开启,通过map操作开启多线程并返回结果;
注意:map操作之后一定要先收集结果,结束流操作;然后再重新开启流执行CompletableFuture::join操作,如果不先结束流操作,直接执行CompletableFuture::join就会造成第一个线程就会阻塞,剩下的线程还没有开启,最终达不到多线程执行的效果

Integer size = req.getPageSize();
Integer num = req.getCurrentPage();
String redisKey = StringUtils.join(req.getSearchIds(), ",") + "--timeCycle:" + req.getTimeCycle();
String redisCache = (String) redisUniteUtil.get(redisKey);
if (Objects.nonNull(redisCache)) {
    List<String> cacheOptions = JSONObject.parseArray(redisCache, String.class);
    return getOptionsVO(cacheOptions, num, size);
}
List<String> options = req.getSearchIds().stream()
        .map(id -> new QueryOptionReq().setDataSource(req.getDataSource()).setFieldName(req.getFieldName())
                .setSearchId(id).setTableName(req.getTableName())
                .setTimeCycle(req.getTimeCycle()).setSearchIds(req.getSearchIds()))
        .map(newReq -> CompletableFuture.supplyAsync(() -> queryOneOptions(newReq), almQueryThreadPool))
        .collect(Collectors.toList())
        .stream()
        .map(CompletableFuture::join)
        .map(OptionsVO::getOptionList)
        .flatMap(Collection::stream)
        .distinct()
        .collect(Collectors.toList());

//返回前缓存
redisUniteUtil.set(redisKey, JSON.toJSONString(options), 90L, TimeUnit.SECONDS);
return getOptionsVO(options, num, size);