3 回答
TA贡献1821条经验 获得超6个赞
在功能上,这两种方法或多或少是相同的:
您提交任务以供执行;
你不等结果。
但是,从技术上讲,存在一些细微差别:
在第二种方法中,您没有指定执行程序,因此它将使用通用的
ForkJoinPool
.supplyAsync()
如果您不想要,则必须将 executor 作为第二个参数传递;该
CompletableFuture
API允许容易地连锁更多的呼叫用thenApply()
,thenCompose()
等,这是由此更灵活比简单的Future
返回通过ExecutorService.submit()
;Using
CompletableFuture
允许child()
使用return CompletableFuture.allOf(the previously created futures)
.
关于可读性,这是一个偏好问题,但如果您想要等效的代码,CompletableFuture
一旦您对其进行了类似的格式化,该方法可能会被认为可读性稍差。相比:
executorService.submit(MyFileService::service1);
executorService.submit(MyFileService::service2);
executorService.submit(MyFileService::service3);
和
CompletableFuture.supplyAsync(MyFileService::service1, executorService);
CompletableFuture.supplyAsync(MyFileService::service2, executorService);
CompletableFuture.supplyAsync(MyFileService::service3, executorService);
TA贡献1921条经验 获得超9个赞
在这两种情况下,您都不会等待结果。
第二种方法的优点是更少的样板文件。这就是runAsync()
和supplyAsync()
是不错的。
但是如果你实际上没有返回任何值,你应该使用 runAsync()
第二种方法还提供了等待所有期货的能力CompletableFuture.allOf()
。这在第一个场景中也不存在。
TA贡献1824条经验 获得超6个赞
如果您使用的是 executorservice,请不要忘记在 executor 上调用 shutdown()。您也可以使用 runAsync() 而不是 supplyAsync()。
添加回答
举报