今天我们来讲一下CompletableFuture为什么可以做到异步,探讨一下源码。
现在我先写一个小demo案例,是去获取天气预报的数据。
这是一个很简单的例子。
然后我们使用CompletableFuture去调用执行这个方法。
我们先看看运行结果:
可以发现main线程先执行,也就证明这确实是一个异步线程。
接下来我们看看这个supplyAsync()方法的源码。
点进去:
继续点进去:
我们可以看到这一行代码:
调用了e.excute();e就是一个Executor,其实就是一个执行器,我们继续返回刚刚上一个方法
supplyAsync(),发现这个值是ASYNC_POOL,我们去追溯一下。
这个值是一个三元运算符,如果USE_COMMON_POOL是true的话,ASYNC_POOL就等于ForkJoinPool.commonPool();那么我们就看看USE_COMMON_POOL的值是多少。
如果ForkJoinPool.getCommonPoolParallelism() > 1 的话,USE_COMMON_POOL就是true了,如果为true的话,ASYNC_POOL的值就是ForkJoinPool.commonPool()。
那么我们现在直接在代码中调用一下值是多少。
值是15,> 1 ,说明USE_COMMON_POOL是true,那就证明调用了ForkJoinPool.commonPool()的方法,我们看看这个方法又是如何样的。
返回了一个ForkJoinPool对象
看看这个对象是啥意思。
所以其实ForkJoinPool就是一个线程池。
总结:
CompletableFuture底层默认使用的是ForkJoinPool线程池。
最后:
如果大家觉得这篇文章对你们有所帮助的话,麻烦给个免费的赞赞,也祝各位码农在IT路上越走越远,高歌猛进!