[英]Is it possible to access a database asynchronously through Java NIO non-blocking sockets?
[英]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
CompletableFuture本身始终是非阻塞的。 仅当用户将阻塞方法作为参数传递给CompletableFuture方法时,才可以发生阻塞。
是的,但前提是所有代码正在完成的所有工作都是非阻塞的。 许多现有的库都包含阻塞IO。 如果他们在您的唯一线程上执行此操作,则其他所有操作都将等待。 语言中没有什么可以阻止您这样做。
解决此问题的常用方法是预留一个或多个线程池以阻止工作负载(并将它们包装在确保执行转移到这些代码的代码中)。
另外,即使一切都没有阻塞,您可能仍希望拥有与CPU内核数量一样多的线程(以便能够利用那些线程)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.