@FunctionImpl
@RequiredArgsConstructor
public class FrontSourcingMultiThreadFuncImpl implements FrontSourcingMultiThreadFunc {
private final static int coreCount = Runtime.getRuntime().availableProcessors();
/**
* 使用erda提供的创建线程池,可以增加监控
*
*/
private final static ExecutorService executors = ExecutorServiceWrapper.delegate(new ThreadPoolExecutor(
(int) (coreCount * 0.75 * (1 + 90 / 10)),
coreCount * 10,
30,
TimeUnit.MINUTES,
new LinkedBlockingQueue<>(coreCount * 10)
));
private final SingleFrontSourcingFlow singleFrontSourcingFlow;
@Override
public List<FrontOrderSourcingTO> execute(List<FrontOrderSourcingTO> frontOrderSourcingTOS){
List<FrontOrderSourcingTO> map = map(frontOrderSourcingTOS, singleFrontSourcingFlow::execute);
return map;
}
private static <T, R> List<R> map(Collection<T> data, Function<T, R> action) {
if (data == null || data.isEmpty()) {
return new ArrayList<>();
}
List<Future<R>> futures = data.stream()
.map(item -> executors.submit(() -> action.apply(item)))
.collect(Collectors.toList());
ArrayList<R> rs = new ArrayList<>();
for (Future<R> future : futures) {
try {
R r = future.get();
rs.add(r);
} catch (InterruptedException | ExecutionException e) {
throw new BusinessException("front sourcing multi thread error",e);
}
}
return rs;
}
}
线程池的简单使用
最新推荐文章于 2022-10-19 21:42:19 发布