多线程之回调异步处理Future和CompletableFuture

Future异步回调

public class TestFutura2 {
    public static void main(String[] args) throws Exception {

        ExecutorService pool = Executors.newSingleThreadExecutor();
        //任务c1放入线程池并行执行
        C1 c1 = new C1();
        Future<Double> future = pool.submit(c1);
        pool.shutdown();
        System.out.println("继续执行主线程任务");
        //等待执行结果
        Double r = future.get();
        System.out.println("确认r1任务已结束,并得到了执行结果: "+r);
    }

    static class C1 implements Callable<Double> {
        @Override
        public Double call() throws Exception{
            Thread.sleep(3000);
            return Math.random();
        }
    }
}

运行结果:

继续执行主线程任务
确认r1任务已结束,并得到了执行结果: 0.7236221399198196

CompletableFuture

public class CompletableFutureDemo {
    public static void main(String[] args) {
        //线程回调
        CompletableFuture<Object> cf = new CompletableFuture<>();

        for (int i = 0; i < 5; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"阻塞等待执行结果");
                try{
                    //cf.get() 阻塞获取命令信息
                    System.out.println(Thread.currentThread().getName()+"获取执行结果---->"+cf.get());
                }catch (Exception e){ }
            },"线程-"+i).start();
        }

        new Thread(()->{
            try{
                TimeUnit.SECONDS.sleep(2);
                //解除阻塞,继续执行cf.get方法之后的代码,并获取结果
                cf.complete(Math.random());
            }catch (Exception e){ }
        }).start();
    }
}

输出结果:

线程-0阻塞等待执行结果
线程-3阻塞等待执行结果
线程-2阻塞等待执行结果
线程-1阻塞等待执行结果
线程-4阻塞等待执行结果
线程-1获取执行结果---->0.1804630976805568
线程-3获取执行结果---->0.1804630976805568
线程-2获取执行结果---->0.1804630976805568
线程-4获取执行结果---->0.1804630976805568
线程-0获取执行结果---->0.1804630976805568

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值