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中一样,您可以在其上“映射”(添加。然后添加处理程序)。你最终得到了另一个可计算的未来
。