Future和CompletableFuture的使用

1、future使用

public class FutureDemo {
    private static Logger logger = LoggerFactory.getLogger(FutureDemo.class);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask futureTask = new FutureTask(()->{
            logger.info("futureTask ->callable 执行!!!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"返回任务结果");

        new Thread(futureTask).start();
        /**
         * 获取结果
         */
        //futureTask.get();
        /**
         * 是否执行完成
         */
        //futureTask.isDone();
        System.out.println(futureTask.get());
    }
}

2、CompletionService


import java.util.concurrent.*;

public class CompletionServiceDemo {
    private static ThreadPoolExecutor threadPoolExecutor =
            new ThreadPoolExecutor(10,20,10, TimeUnit.SECONDS,new LinkedBlockingQueue<>());

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPoolExecutor);

        completionService.submit(()->{
            try {
                Thread.sleep(800);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },800);

        completionService.submit(()->{
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },1000);
        completionService.submit(()->{
            try {
                Thread.sleep(15000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },1500);

        for (int i = 0; i < 3; i++) {
            /**
             * take获取先执行出来的数据
             */
            Integer integer = completionService.take().get();
            System.out.println(integer);

        }
        threadPoolExecutor.shutdown();
    }
}

3、CompletableFuture 简单使用

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.CompletableFuture;


public class CompletableFutureDemo {
    private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
    static {
        threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(10);
        threadPoolTaskExecutor.setMaxPoolSize(10);
        threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
        threadPoolTaskExecutor.setQueueCapacity(1000);
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        threadPoolTaskExecutor.initialize();
    }

    private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);

    public static void main(String[] args) {

        /**
         * 依赖关系
         * 1、thenApply() 把前面异步任务的结果,交给后面的Future
         * 2、thenCompose() 连接2个有依赖关系的任务
         *
         * and聚合关系
         * 1、thenCombine()任务合并,有返回值
         * 2、thenAcceptBoth() 2个任务都完成后将结果交给thenAcceptBoth()消耗
         * 3、runAfterBoth() 2个任务都执行完成后,执行下一步操作
         *
         * or聚合关系
         * 1、applyToEither() 2个任务谁执行的快就使用哪个结果,有返回值
         * 2、acceptEither() 2个任务谁执行的快就使用哪个结果,没有返回值
         * 3、runAfterEither() 任意一个任务执行完成,进行下一步操作
         *
         * 并行执行
         * anyOf() 和 allOf()
         */
        CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(() -> {
            logger.info("异步没有返回值!!");
        },threadPoolTaskExecutor);

        CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
            logger.info("异步有返回值!!");
            return "aaaa";
        }, threadPoolTaskExecutor);
        logger.info("异步返回值[{}]",stringCompletableFuture.join());

        threadPoolTaskExecutor.shutdown();

    }

4、CompletableFuture 执行完成后执行(whenComplete()或 whenCompleteAsync())

package com.example.jucdemo.future;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;

/**
 * 依赖关系
 * 1、thenApply() 把前面异步任务的结果,交给后面的Future
 * 2、thenCompose() 连接2个有依赖关系的任务
 *
 * and聚合关系
 * 1、thenCombine()任务合并,有返回值
 * 2、thenAcceptBoth() 2个任务都完成后将结果交给thenAcceptBoth()消耗
 * 3、runAfterBoth() 2个任务都执行完成后,执行下一步操作
 *
 * or聚合关系
 * 1、applyToEither() 2个任务谁执行的快就使用哪个结果,有返回值
 * 2、acceptEither() 2个任务谁执行的快就使用哪个结果,没有返回值
 * 3、runAfterEither() 任意一个任务执行完成,进行下一步操作
 *
 * 并行执行
 * anyOf() 和 allOf()
 */
public class CompletableFutureDemo {
    private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
    static {
        threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(10);
        threadPoolTaskExecutor.setMaxPoolSize(10);
        threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
        threadPoolTaskExecutor.setQueueCapacity(1000);
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        threadPoolTaskExecutor.initialize();
    }

    private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);

    public static void main(String[] args) {


        CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(() -> {
            logger.info("异步没有返回值!!");
        },threadPoolTaskExecutor);

        /**
         * 执行完成后执行 whenComplete()或者 whenCompleteAsync()方法
         * 异常之后执行 exceptionally()
         */
        CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
            logger.info("异步有返回值!!");
            return "aaaa";
        }, threadPoolTaskExecutor);

        /**
         * 执行完成后异步执行 另一个线程执行
         */
        stringCompletableFuture.whenCompleteAsync(new BiConsumer<String, Throwable>() {
            @Override
            public void accept(String s, Throwable throwable) {
                logger.info("supplyAsync执行完成后获取返回值[{}]",s);
            }
        },threadPoolTaskExecutor);
        /**
         * 同步执行  执行stringCompletableFuture的线程执行
         */
        stringCompletableFuture.whenComplete(new BiConsumer<String, Throwable>() {
            @Override
            public void accept(String s, Throwable throwable) {
                logger.info("supplyAsync执行完成后获取返回值[{}]",s);
            }
        });
        
        logger.info("异步返回值[{}]",stringCompletableFuture.join());

        threadPoolTaskExecutor.shutdown();

    }


}

5、CompletableFuture 执行抛异常执行


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
import java.util.function.Function;

/**
 * 依赖关系
 * 1、thenApply() 把前面异步任务的结果,交给后面的Future
 * 2、thenCompose() 连接2个有依赖关系的任务
 *
 * and聚合关系
 * 1、thenCombine()任务合并,有返回值
 * 2、thenAcceptBoth() 2个任务都完成后将结果交给thenAcceptBoth()消耗
 * 3、runAfterBoth() 2个任务都执行完成后,执行下一步操作
 *
 * or聚合关系
 * 1、applyToEither() 2个任务谁执行的快就使用哪个结果,有返回值
 * 2、acceptEither() 2个任务谁执行的快就使用哪个结果,没有返回值
 * 3、runAfterEither() 任意一个任务执行完成,进行下一步操作
 *
 * 并行执行
 * anyOf() 和 allOf()
 */
public class CompletableFutureDemo {
    private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
    static {
        threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(10);
        threadPoolTaskExecutor.setMaxPoolSize(10);
        threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
        threadPoolTaskExecutor.setQueueCapacity(1000);
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        threadPoolTaskExecutor.initialize();
    }

    private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);

    public static void main(String[] args) {
        /**
         * 执行完成后执行 whenComplete()或者 whenCompleteAsync()方法
         * 异常之后执行 exceptionally()
         */
        CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
            logger.info("异步有返回值!!");
            List list = null;
            list.add("1");
            return "aaaa";
        }, threadPoolTaskExecutor);

        /**
         * 执行完成后异步执行 另一个线程执行
         */
//        stringCompletableFuture.whenCompleteAsync(new BiConsumer<String, Throwable>() {
//            @Override
//            public void accept(String s, Throwable throwable) {
//                logger.info("supplyAsync执行完成后获取返回值[{}]",s);
//            }
//        },threadPoolTaskExecutor);
        /**
         * 同步执行  执行stringCompletableFuture的线程执行
         */
        stringCompletableFuture.whenComplete(new BiConsumer<String, Throwable>() {
            @Override
            public void accept(String s, Throwable throwable) {
                logger.info("supplyAsync执行完成后获取返回值[{}]",s);
            }
        });
         /**
         * 异常执行
         */
        CompletableFuture<String> exceptionally = stringCompletableFuture.exceptionally(new Function<Throwable, String>() {
            @Override
            public String apply(Throwable throwable) {
                logger.info("异常【{}】", throwable.getMessage());
                return throwable.getMessage();
            }
        });
        logger.info("异常返回值[{}]",exceptionally.join());

        logger.info("异步返回值[{}]",stringCompletableFuture.join());

        threadPoolTaskExecutor.shutdown();

    }

6、CompletableFuture上一个执行完成的返回值作为下一个的入参(thenApply()/thenApplyAsync())


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.CompletableFuture;


public class CompletableFutureDemo1 {
    private static ThreadPoolTaskExecutor threadPoolTaskExecutor;

    static {
        threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(10);
        threadPoolTaskExecutor.setMaxPoolSize(10);
        threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
        threadPoolTaskExecutor.setQueueCapacity(1000);
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        threadPoolTaskExecutor.initialize();
    }

    private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo1.class);

    public static void main(String[] args) {
        /**
         * 上一个结果的做为下一个任务的入参
         * thenApply() 同步
         * 或
         * thenApplyAsync() 异步
         */
        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            logger.info("异步有返回值!!");
            return "Hello";
        }, threadPoolTaskExecutor).thenApply(h->{
            return h + "World";
        });
        /*CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            logger.info("异步有返回值!!");
            return "Hello";
        }, threadPoolTaskExecutor)
                .thenApply(h->{
            return h + "World";
        }).thenApply(w->{
            return w+".";
        });*/
        logger.info("{}",completableFuture.join());

        /**
         * 异步
         */
        CompletableFuture<String> async = CompletableFuture.supplyAsync(() -> {
            logger.info("异步有返回值2!!");
            return "Hello";
        }, threadPoolTaskExecutor).thenApplyAsync(h->{
            return h + "World";
        },threadPoolTaskExecutor);

        logger.info("{}",async.join());

        threadPoolTaskExecutor.shutdown();
    }
}

7、thenCombine() 任务合并

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class CompletableFutureDemo {
    private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
    private static ThreadPoolTaskExecutor threadPoolTaskExecutor;

    static {
        threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(10);
        threadPoolTaskExecutor.setMaxPoolSize(10);
        threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
        threadPoolTaskExecutor.setQueueCapacity(1000);
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        threadPoolTaskExecutor.initialize();
    }



    public static void main(String[] args) {
        /**
         * 上一个结果的做为下一个任务的入参
         * thenApply() 同步
         * 或
         * thenApplyAsync() 异步
         *
         * thenCombine()合并两个结果,上一个执行完成的和当前执行完成的 z上一个结果 e当前结果
         */
        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            logger.info("异步有返回值!!");
            return "Hello";
        }, threadPoolTaskExecutor).thenApply(h->{
            return h + "World!";
        }).thenCombine(CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "你好 世界";
        },threadPoolTaskExecutor),(z,e)->{
            return z + e;
        });
        logger.info("{}",completableFuture.join());
        threadPoolTaskExecutor.shutdown();
    }


}

8、applyToEitherAsync() 异步 哪个先执行完成,就用哪个结果


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.CompletableFuture;

public class CompletableFutureDemo {
    private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
    private static ThreadPoolTaskExecutor threadPoolTaskExecutor;

    static {
        threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(10);
        threadPoolTaskExecutor.setMaxPoolSize(10);
        threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
        threadPoolTaskExecutor.setQueueCapacity(1000);
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        threadPoolTaskExecutor.initialize();
    }


    public static void main(String[] args) {
        /**
         * applyToEitherAsync() 异步 哪个先执行完成,就用哪个结果
         * applyToEither() 同步
         */
        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
                    logger.info("111公交车正在赶来");
                    return "111公交车到了";
                }, threadPoolTaskExecutor)
                .applyToEither(CompletableFuture.supplyAsync(() -> {
                    logger.info("222公交车正在赶来");

                    return "222公交车到了";
                }, threadPoolTaskExecutor), (s) -> {
                    if (s.startsWith("111")) {
                        logger.info("111公交车到了");
                    }
                    if (s.startsWith("222")) {
                        logger.info("222公交车到了");
                    }
                    return s;
                });
//        logger.info("{}",completableFuture.join());
        threadPoolTaskExecutor.shutdown();

    }

}

9、thenAccept() | thenAcceptAsync()没有返回结果的 在thenAccept中获取上一个参数直接使用


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.CompletableFuture;

public class CompletableFutureDemo {
    private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
    private static ThreadPoolTaskExecutor threadPoolTaskExecutor;

    static {
        threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(10);
        threadPoolTaskExecutor.setMaxPoolSize(10);
        threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
        threadPoolTaskExecutor.setQueueCapacity(1000);
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        threadPoolTaskExecutor.initialize();
    }


    public static void main(String[] args) {
        /**
         * thenAccept() 没有返回结果的  在thenAccept中获取上一个参数直接使用
         *
         * thenAcceptAsync() 异步
         */
        CompletableFuture<Void> completableFuture = CompletableFuture.supplyAsync(() -> {
            int a = 2;
            logger.info("第一个值:{}", a);

            return a;
        }, threadPoolTaskExecutor).thenAccept(s -> {
            logger.info("倍数:{}", s * s);
        });
        /**
         * 异步
         */
        CompletableFuture<Void> completableFutureAsync = CompletableFuture.supplyAsync(() -> {
                    int a = 2;
                    logger.info("第一个值:{}", a);
                    return a;
                }, threadPoolTaskExecutor)
                .thenAcceptAsync(s -> {
                    logger.info("倍数:{}", s * s);
                }, threadPoolTaskExecutor);


    }

}

10、thenAcceptBoth|thenAcceptBothAsync() 对2个CompletableFuture的结果进行操作

package com.example.jucdemo.future;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.CompletableFuture;

public class CompletableFutureDemo {
    private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
    private static ThreadPoolTaskExecutor threadPoolTaskExecutor;

    static {
        threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(10);
        threadPoolTaskExecutor.setMaxPoolSize(10);
        threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
        threadPoolTaskExecutor.setQueueCapacity(1000);
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        threadPoolTaskExecutor.initialize();
    }


    public static void main(String[] args) {
        /**
         * thenAcceptBothAsync() 异步,对2个CompletableFuture的结果进行操作
         * thenAcceptBoth() 同步
         */
        CompletableFuture<Integer> integerCompletableFuture1 = CompletableFuture.supplyAsync(() -> {
            int a = 2;
            logger.info("第一个值:{}", a);
            return a;
        }, threadPoolTaskExecutor);

        CompletableFuture<Integer> integerCompletableFuture2 = CompletableFuture.supplyAsync(() -> {
            int a = 3;
            logger.info("第二个值:{}", a);
            return a;
        }, threadPoolTaskExecutor);

       integerCompletableFuture1.thenAcceptBothAsync(integerCompletableFuture2, (s1, s2) -> {
            logger.info("求和:{}", s1 + s2);
        }, threadPoolTaskExecutor);
        threadPoolTaskExecutor.shutdown();
    }

}

11、anyOf() 有一个返回即可

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.CompletableFuture;

public class CompletableFutureDemo {
    private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
    private static ThreadPoolTaskExecutor threadPoolTaskExecutor;

    static {
        threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(10);
        threadPoolTaskExecutor.setMaxPoolSize(10);
        threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
        threadPoolTaskExecutor.setQueueCapacity(1000);
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        threadPoolTaskExecutor.initialize();
    }


    public static void main(String[] args) {
        /**
         * anyOf() 有一个返回即可
         */
        CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> {
            return "Hello";
        }, threadPoolTaskExecutor);
        CompletableFuture<String> completableFuture2 = CompletableFuture.supplyAsync(() -> {
            return "World";
        }, threadPoolTaskExecutor);

        CompletableFuture<Object> result = CompletableFuture.anyOf(completableFuture1,
                completableFuture2);
        logger.info("result:{}", result.join());
        
        threadPoolTaskExecutor.shutdown();
    }

}

12、allOf() 全部执行完

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.CompletableFuture;

public class CompletableFutureDemo {
    private static Logger logger = LoggerFactory.getLogger(CompletableFutureDemo.class);
    private static ThreadPoolTaskExecutor threadPoolTaskExecutor;

    static {
        threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(10);
        threadPoolTaskExecutor.setMaxPoolSize(10);
        threadPoolTaskExecutor.setThreadNamePrefix("CompletableFutureDemo-");
        threadPoolTaskExecutor.setQueueCapacity(1000);
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        threadPoolTaskExecutor.initialize();
    }


    public static void main(String[] args) {
        /**
         * allOf() 全部执行完
         */
        CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> {
            return "Hello";
        }, threadPoolTaskExecutor);
        CompletableFuture<String> completableFuture2 = CompletableFuture.supplyAsync(() -> {
            return "World";
        }, threadPoolTaskExecutor);

        CompletableFuture<Void> voidCompletableFuture = CompletableFuture.allOf(completableFuture1, completableFuture2);
        logger.info("completableFuture1:{},completableFuture2:{}",completableFuture1.isDone(),completableFuture2.isDone());

        threadPoolTaskExecutor.shutdown();
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值