繁体   English   中英

Java是否可以通过CompletableFuture真正实现“非阻塞”? 是否可以用一个线程异步处理所有内容?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM