Future、FutureTask及CompletableFuture学习笔记

本文深入探讨了Java中线程池的使用方法,包括如何通过ExecutorService创建线程池,以及如何利用Future和FutureTask来管理和获取异步任务的结果。通过具体的代码示例,展示了线程池在并发编程中的应用。

回到大纲

目录

Future

FutureTask


Future

future是接口,用future时,future作为线程池的返回值,线程池的入参为new Callable();

//定义线程池
        ExecutorService executorService = Executors.newFixedThreadPool(30);

        //1.用Future
        List<Future<Integer>> futures = new ArrayList<Future<Integer>>();
        String mainThreadName = Thread.currentThread().getName();
        for(int i=0; i<10; i++){
            Future<Integer> future = executorService.submit(new Callable<Integer>(){
                public Integer call(){
                    String oldThreadName = Thread.currentThread().getName();
                    try{
                        System.out.println("oldThreadName==="+oldThreadName);
                        String newThreadName = mainThreadName + "===" + oldThreadName;
                        System.out.println("newThreadName==="+newThreadName);

                        Thread.currentThread().setName(newThreadName);
                        Thread.sleep(1 * 1000);
                        return 1;
                    }catch(Exception e){
                        return 1;
                    }finally{
                      //  Thread.currentThread().setName(oldThreadName);
                    }
                }
            });

            futures.add(future);
        }

        for(int j=0; j<10; j++ ){
            try {
                System.out.println(futures.get(j).get(25, TimeUnit.SECONDS));
            }catch (Exception e){
                System.out.println("超时了");
            }

        }

FutureTask

FutrueTask是Futrue的实现,因为实现了Runnable接口,可以被submit,

用个FutrueTask时,构造FutureTask futureTask = new FutureTask(new Callable());

exe.submit(futureTask);

futureTask.get();

        List<FutureTask<Integer>> tasks = new ArrayList<FutureTask<Integer>>();


        for(int i=0;i<10;i++){
            final Integer num = i;
            FutureTask<Integer> task = new FutureTask(new Callable<Integer>(){
                public Integer call(){
                    return num;
                }
            });
            executorService.submit(task);
            tasks.add(task);
        }

        for(int j=0; j<10;j++){
            try {
                System.out.println(tasks.get(j).get());

            }catch (Exception e){

            }
        }

总结:不管是future 还是 futureTask在执行executorService.submit()时都遵循Java多线程实现方式-CSDN博客 中callable的过程,自定义实现run方法,内部执行call。在submit到线程池后,将自己的run方法交由线程池执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值