CompletableFuture 多线程、单线程并发,还是两者兼而有之?
CompletableFuture multi-threaded, single thread concurrent, or both?
我刚开始研究 Java 的 CompletableFuture 并且有点困惑这是真正的异步(即 运行 在一个线程上并发)还是跨越多个线程(平行线)。
例如,假设我想拨打 1000 次不同的服务电话。进一步假设每个服务调用都可以异步进行。当使用 CompletableFuture 时,JVM 会创建 1000 个单独的线程(假设 JVM 允许这么多线程),还是在一个线程中执行所有这些请求?还是两者兼而有之?使用一些线程异步执行这些请求?
我想做的是这样的(在Python):
https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html
有没有办法在 Java 中的同一线程上异步执行多个 requests/operations?
如 javadoc
中所述
All async methods without an explicit Executor argument are performed
using the ForkJoinPool.commonPool() (unless it does not support a
parallelism level of at least two, in which case, a new Thread is
created to run each task).
因此使用了线程池,可以是隐式的(除非你有一个单核机器,在这种情况下线程不会被池化)或显式的。在您的情况下,您可以通过使用显式 Executor
(例如 ThreadPoolExecutor)和您想要的线程数量(很可能少于 1000)来控制使用的线程数量。
调用不能共享单个线程(调用线程),因为 Java 没有 capability 由于流行的 async/await 范例(即虚构的“真正异步”术语 - 同步与异步独立于线程,但异步性可以通过线程实现,如 CompletableFuture
中所做的那样)。
如果您在不指定线程池的情况下安排计算,将使用 fork-join
公共池,否则您可以指定自己的 Executor
到 supplyAsync
并选择一个大小符合您的需要。
尝试使用CompletableFuture.thenCompose()
以异步方式顺序 运行 多个未来。
我刚开始研究 Java 的 CompletableFuture 并且有点困惑这是真正的异步(即 运行 在一个线程上并发)还是跨越多个线程(平行线)。
例如,假设我想拨打 1000 次不同的服务电话。进一步假设每个服务调用都可以异步进行。当使用 CompletableFuture 时,JVM 会创建 1000 个单独的线程(假设 JVM 允许这么多线程),还是在一个线程中执行所有这些请求?还是两者兼而有之?使用一些线程异步执行这些请求?
我想做的是这样的(在Python): https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html
有没有办法在 Java 中的同一线程上异步执行多个 requests/operations?
如 javadoc
中所述All async methods without an explicit Executor argument are performed using the ForkJoinPool.commonPool() (unless it does not support a parallelism level of at least two, in which case, a new Thread is created to run each task).
因此使用了线程池,可以是隐式的(除非你有一个单核机器,在这种情况下线程不会被池化)或显式的。在您的情况下,您可以通过使用显式 Executor
(例如 ThreadPoolExecutor)和您想要的线程数量(很可能少于 1000)来控制使用的线程数量。
调用不能共享单个线程(调用线程),因为 Java 没有 capability 由于流行的 async/await 范例(即虚构的“真正异步”术语 - 同步与异步独立于线程,但异步性可以通过线程实现,如 CompletableFuture
中所做的那样)。
如果您在不指定线程池的情况下安排计算,将使用 fork-join
公共池,否则您可以指定自己的 Executor
到 supplyAsync
并选择一个大小符合您的需要。
尝试使用CompletableFuture.thenCompose()
以异步方式顺序 运行 多个未来。