这里我提供一个例子,告诉你什么是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兑现才退出。目前还没有一个好的比喻来说明这个行为。。。