package com.hzxy.AssistCase.util;
import lombok.SneakyThrows;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadUtil {
public static void main(String[] args) {
// 创建线程池
ExecutorService threadPool = Executors.newFixedThreadPool(5);
Map<String, String> result = new ConcurrentHashMap();
// 添加时间标点查看时间
long startTime = System.currentTimeMillis();
CompletableFuture.allOf(
CompletableFuture.runAsync(() -> result.put("key1", method1()), threadPool),
CompletableFuture.runAsync(() -> result.put("key2", method2()), threadPool),
CompletableFuture.runAsync(() -> result.put("key3", method3()), threadPool)
).join();
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
@SneakyThrows
private static String method3() {
Thread.sleep(700);
return "value3";
}
@SneakyThrows
private static String method2() {
Thread.sleep(600);
return "value2";
}
@SneakyThrows
private static String method1() {
Thread.sleep(500);
return "value1";
}
}
CompletableFuture是对Future的扩展和增强。CompletableFuture实现了Future接口,并在此基础上进行了丰富的扩展,完美弥补了Future的局限性,同时CompletableFuture实现了对任务编排的能力。借助这项能力,可以轻松地组织不同任务的运行顺序、规则以及方式。从某种程度上说,这项能力是它的核心能力。而在以往,虽然通过CountDownLatch等工具类也可以实现任务的编排,但需要复杂的逻辑处理,不仅耗费精力且难以维护。
CompletableFuture的继承自CompletionStage和Future。
CompletionStage接口定义了任务编排的方法,执行某一阶段,可以向下执行后续阶段。异步执行的,默认线程池是ForkJoinPool.commonPool(),但为了业务之间互不影响,且便于定位问题,强烈推荐使用自定义线程池。
版权声明:本文为weixin_42499566原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。