异步编程CompletableFuture的一些使用demo
public static ThreadPoolExecutor executor=new ThreadPoolExecutor(5,5,5L, TimeUnit.SECONDS,new LinkedBlockingQueue<>(1000),new ThreadPoolExecutor.CallerRunsPolicy()); public static void main(String[] args) throws Exception { CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> { log.info(">>>>>>>>>>>先执行这个 并且设置返回值"); return 10/2; }, executor); CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> { log.info(">>>>>>>>>>>这个没有返回值的"); }, executor); CompletableFuture<Void> future2 = future.thenAcceptAsync((res) -> { log.info(">>>>>>>>>>>这个是在future执行完后执行这个, res 就是 future 执行的结果:{}", res); log.info(">>>>>>>>>>>这个没有返回值"); },executor); CompletableFuture<String> future3 = future.thenApplyAsync((res) -> { log.info(">>>>>>>>>>>> 这个也是在future 执行完后执行,res也是future 执行的结果:{} ",res); log.info(">>>>>>>>>>这个是可以有返回值的"); return "1"; },executor); //等待所有任务执行完成 因为future2 是在future 完成之后执行的 所以这个 future 没必要放进去 CompletableFuture.allOf(future1,future2,future3).get(); //只要有一个完成就可以 // CompletableFuture.anyOf(future1,future2,future3).get(); System.out.println(future3.get()); }
如果是for循环里面执行的 可以这样写
List<CompletableFuture<Void>> futures = new LinkedList<>(); for (int i = 1; i <= pageTotal; i++) { CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> { }, executor); futures.add(future1); } //等待所有执行完成 CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
-----------------------有任何问题可以在评论区评论,也可以私信我,我看到的话会进行回复,欢迎大家指教------------------------
(蓝奏云官网有些地址失效了,需要把请求地址lanzous改成lanzoux才可以)