主要针对一些并行计算的场景
对于cola架构,这样的封装的执行器,方便团队开发,也便于管理线程池。
注意事项:
- 这里只封装展示计算部分,其他的异常处理等逻辑请按需加
- 这并非是解决该类问题的万能通用方法
- stream使用请注意内存资源使用情况
- 代码中 .collect(Collectors.toList()).stream() 不能省略
/**
* @author SurfingMaster
*/
@Component
public class ParallelExecutor<S, R> {
@Qualifier("thExe")
@Autowired
private ThreadPoolTaskExecutor thExe;
public List<R> cal(List<S> rawData, Function<S, R> func) {
return rawData.stream()
.map(e ->
CompletableFuture.supplyAsync(() -> func.apply(e), thExe))
.collect(Collectors.toList()) // 不能省略
.stream() // 不能省略
.map(CompletableFuture::join)
.collect(Collectors.toList());
}
public List<R> cal(List<S> rawData, Function<S, R> func, int timeout) {
return rawData.stream()
.map(e ->
CompletableFuture.supplyAsync(() -> func.apply(e), thExe))
.collect(Collectors.toList())
.stream()
.map(x-> {
try {
return x.get(timeout, TimeUnit.MILLISECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toList());
}
}