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 的方法时才会发生阻塞。
虽然我知道使用 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 的方法时才会发生阻塞。