stackoverflow上关于Promise和Future的形象比喻(翻)

这里我提供一个例子,告诉你什么是Promise,而且与Future不同,promise的值在某一时刻是如何被改变的,Future的值是只读的。

假如你有个老妈而且你找她要钱。

// 现在,你糊弄你老妈,让她做了一个promise最终会给你一笔钱,
// 老妈返回给了你promise对象,但是她并没有立刻兑现
Supplier<Integer> momsPurse = ()-> {
        try {
            Thread.sleep(1000);//mom is busy
        } catch (InterruptedException e) {
            ;
        }
        return 100;
    };

ExecutorService ex = Executors.newFixedThreadPool(10);

CompletableFuture<Integer> promise =  
CompletableFuture.supplyAsync(momsPurse, ex);

// 你和高兴,迫不及待的感谢老妈:
promise.thenAccept(u->System.out.println("Thank you mom for $" + u ));

// 但是你老爸干涉了这件事,打破了老妈的计划而且用很少的钱兑现了这个promise(设定了promise的值),
// 老爸做的很果断,但是老妈却慢吞吞的(注意Thread.sleep(...)):
promise.complete(10); 

Output of that is:

Thank you mom for $10

老妈做出了promise,但是在等待一些“完成”事件。

CompletableFuture<Integer> promise...

你做出接收她的promise并且表示感谢的事件:

promise.thenAccept...

这时候老妈开始打开钱包,但是动作很慢。。。
而且老爸很快干涉进来,比老妈先完成了promise:

promise.complete(10);

.你有注意到我使用了一个显式创建的执行器吗?
有意思的是,如果你使用默认隐式执行器而不是(通用线程池)而且老爸不在家,而且只有老妈和她“慢吞吞的钱包”,那么她的承诺一定会完成吗,前提是程勋运行时间要超过老妈从钱包里取出钱的时间。

默认执行器的运行类似于“守护线程”,不会等所有promise兑现才退出。目前还没有一个好的比喻来说明这个行为。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值