CompletableFuture 三行代码优雅实现多线程并发

1,389 阅读1分钟

业务并行处理示例

  1. 定义线程池
final static AtomicLong idGen = new AtomicLong(0);
static ExecutorService executor = new ThreadPoolExecutor(3, 3, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), new ThreadFactory() {
    @Override
    public Thread newThread(Runnable cmd) {
        Thread t = new Thread(cmd);
        t.setName("t-prd-" + idGen.incrementAndGet());
        return t;
    }
});
  1. 业务处理模拟
private static String process(ProductCommon product) {
    return "当前线程:" + Thread.currentThread().getName() + ",处理结果测试:" + product.getProductId();
}
  1. 核心三行代码并发处理
List<ProductCommon> products = Lists.newArrayList(p1, p2, p3);
List<CompletableFuture<String>> prdFutures = products.stream()
        .map(i -> CompletableFuture.supplyAsync(() -> process(i), executor))
        .collect(Collectors.toList());
List<String> prdResults = prdFutures.stream().map(CompletableFuture::join).collect(Collectors.toList());
  1. 结果打印
当前线程:t-prd-1,处理结果测试:1
当前线程:t-prd-2,处理结果测试:2
当前线程:t-prd-3,处理结果测试:3

Process finished with exit code 0