异步编程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()]));

 

posted @ 2024-08-21 14:17  yvioo  阅读(1)  评论(0编辑  收藏  举报