3.是有返回值的,返回的值就是 null。
怎么去分别出这三种情况呢?
那么就要看看这个 result 赋值的地方了,用脚指头猜也知道在这里搞了一些事情。
所以简单的找寻一番之后,可以找到这个关键的地方:
框起来的代码,目的是为了获取 CompletableFuture 类中的 result 字段的偏移量,并用大写的 RESULT 存储起来。
有经验的朋友看到这里大概就知道它要用 compareAndSwapObject 这个骚操作了:
然后就能找到这几个和 null 相关的地方:
答案就是我框起来的部分:在 CompletableFuture 里面,把 null 也封装到 AltResult 对象里面了。
基于此,可以区分出前面我说的那三种情况。
你看这里有一个专门的 completeNull 方法,其中的调用者就有 AysncRun 方法:
你可以在其调用的地方打上断点,然后把我前面用 runAsync 提交方式的代码跑起来:
再去看看调用栈,调试一下,你就知道 runAsync 这种,真的没有返回值的是怎么处理的了。
核心技术就是把 null 封装到 AltResult 对象里面。
然后如何分別返回值就是 null 的情况呢?
都有一个代表 null 的对象了,那还不简单吗,一个小小的判断就搞定了:
最后,再提一下这个方法:
java.util.concurrent.CompletableFuture#waitingGet
我之前那篇文章里面写了这样一句话: