Java真的是“吗?”;“非阻塞”;有完整的未来?可以用一个线程异步处理所有事情吗?

Java真的是“吗?”;“非阻塞”;有完整的未来?可以用一个线程异步处理所有事情吗?,java,asynchronous,completable-future,Java,Asynchronous,Completable Future,虽然我知道使用CompletableFuture接口可以实现一定程度的并发性,但我不相信它是真正的无阻塞的 从技术上讲,对于异步IO,难道一个人不应该只用一个线程就可以处理所有事情吗?因为非阻塞意味着线程可以离开一个进程,做其他事情,然后回来 thread0 same/ another thread | | | (makes a http request) --------- P2

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

从技术上讲,对于异步IO,难道一个人不应该只用一个线程就可以处理所有事情吗?因为非阻塞意味着线程可以
离开一个进程,做其他事情,然后回来

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

是,但前提是所有代码所做的所有工作都是非阻塞的。许多现有库都包含阻塞IO。如果他们在你唯一的线程上这样做,那么其他一切都将不得不等待。语言中没有任何东西可以阻止你这么做

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


此外,即使一切都是非阻塞的,您可能仍然希望拥有与CPU核心数量相同的线程(以便能够利用这些线程)。

CompletableFuture本身始终是非阻塞的。
只有当用户将阻塞方法作为参数传递给CompletableFuture的方法时,才会发生阻塞。

谢谢@Thilo,请详细说明
为阻塞工作负载留出一个或多个线程池的情况。
?您不仅仅调用
阻塞函数()
。相反,您可以执行类似于
ioExecutorService.submit(()->blockingFunction)
的操作,然后接收
CompletableFuture
ioExecutorService
必须创建额外的线程来处理阻塞代码(您不希望在主计划程序线程上运行该代码)。您将“非阻塞”与“异步”混为一谈。它们不是一回事。在异步编程中,每当你到达一个集合点,就会有人阻止你。这并没有阻止它异步,这就是它的全部意图。@user207421我知道它将
wait
当有一个集合点时。我要说的是,在javascript中,
服务员可以在等待时做其他事情(非阻塞),但在java CompletableFuture.get()中它不能(阻塞)。我理解错了吗?您不会调用
CompletableFuture.get
,因为正如您所说,这会阻止当前线程。就像在Javascript中一样,您可以在其上“映射”(添加
。然后添加
处理程序)。你最终得到了另一个
可计算的未来