我刚刚开始研究Java CompletableFuture,并且对这是否真正异步(即同时在一个线程上运行)或跨越多个线程(并行)有点困惑。
例如,假设我想要进行1000次不同的服务呼叫。进一步假设每个服务调用可以异步进行。使用CompletableFuture时,JVM是否会生成1000个单独的线程(假设JVM允许这么多线程),或者在一个线程中执行所有这些请求?或者是两者兼而有之?使用一些线程异步执行这些请求?
我想要做的是这样的事情(在Python中): https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html
有没有办法在Java中异步执行同一个线程上的多个请求/操作?
答案 0 :(得分:5)
正如javadoc
中明确解释的那样执行所有没有显式Executor参数的异步方法 使用ForkJoinPool.commonPool()(除非它不支持 并行度至少为两级,在这种情况下,新的Thread是 创建用于运行每个任务)。
因此,隐式或显式地使用池(好吧,除非你有一个核心机器,这些天很少见)。我不建议创建一个包含1000个线程的池。
如果您只想对所有这些异步调用使用单个线程,则可以使用Executors.newSingleThreadExecutor()
并将其作为参数传递(只记得使用相同的执行程序)。
答案 1 :(得分:3)
如果您在未指定线程池的情况下安排计算,则会使用fork-join
公共池,否则您可以指定自己的Executor
到supplyAsync
并选择适合的大小你的需要。
答案 2 :(得分:-1)
尝试使用CompletableFuture.thenCompose()
以异步方式顺序运行多个Future。