CompletableFuture是否使用默认线程池的依据,和机器的CPU核心数有关。当CPU核心数减1大于1时,才会使用默认的线程池(ForkJoinPool),否则将会为每个CompletableFuture的任务创建一个新线程去执行。即,CompletableFuture的默认线程池,只有在双核以上的机器内才会使用。在双核及以下的机器中,会为每个任务创建一个新线程,等于没有使用线程池,且有资源耗尽的风险。
C++20引入的 coroutine 搞了一堆新语,光键字就有 co_await、co_return、co_yield...。coroutine 对于一些上层语言而言可能会更友好,由于它轻便的语法结构,比如微软搞的async-await,但对于尚未引入 lambda 表达式的编程语言,coroutine 这语法糖显然并不适用。
一些高级语言提供的语法糖,结合 lambda 等语法糖确实会让程序结构更清晰。但对于像标准C++那种引入协程的话,充其量就把它当 fork-join 实现。对于C++而言,对于执行权交给IO回调将更好。
当然也可以为生产者-消费者或是订阅者-发布者模式打造 coroutine,但就执行权而言,仍属于当前线程,所以 coroutine这概念效率肯定不如单纯的 callback。