CompletableFuture 可以 Java 真正 "non-blocking" 吗?是否可以用一个线程异步处理所有事情?

Can Java be truly "non-blocking" with CompletableFuture? Is it possible to handle everything asynchronously with one thread?

虽然我知道使用 CompletableFuture 接口可以实现一定程度的并发,但我不相信它是真正的非阻塞。

从技术上讲,异步 IO 不应该只用一个线程就能处理所有事情,因为非阻塞意味着一个线程可以 leave one process, do something else and come back later

thread0                        same/ another thread
    |
    | 
    |
(makes a http request) --------- P2
                                  |
                                  | handle request's followups (e.g. .then())
                                  |
(finishes the request) -----------
    |
    |
   end

是的,但前提是所有代码完成的所有工作都是 non-blocking。许多现有的库都包含阻塞 IO。如果他们在您的唯一线程上执行此操作,则其他一切都将不得不等待。而且语言中没有任何内容可以阻止您这样做。

解决这个问题的通常方法是预留一个或多个线程池来阻塞工作负载(并将它们包装在代码中以确保执行转移到这些线程池)。

此外,即使一切都是 non-blocking,您可能仍希望拥有与 CPU 内核一样多的线程(以便能够利用这些内核)。

CompletableFuture 本身总是 non-blocking。 仅当用户将阻塞方法作为参数传递给 CompletableFuture 的方法时才会发生阻塞。