CompletableFuture多线程,单线程并发,还是两者兼而有之?

时间:2017-07-31 20:07:22

标签: java multithreading concurrency completable-future

我刚刚开始研究Java CompletableFuture,并且对这是否真正异步(即同时在一个线程上运行)或跨越多个线程(并行)有点困惑。

例如,假设我想要进行1000次不同的服务呼叫。进一步假设每个服务调用可以异步进行。使用CompletableFuture时,JVM是否会生成1000个单独的线程(假设JVM允许这么多线程),或者在一个线程中执行所有这些请求?或者是两者兼而有之?使用一些线程异步执行这些请求?

我想要做的是这样的事情(在Python中): https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html

有没有办法在Java中异步执行同一个线程上的多个请求/操作?

3 个答案:

答案 0 :(得分:5)

正如javadoc

中明确解释的那样
  

执行所有没有显式Executor参数的异步方法   使用ForkJoinPool.commonPool()(除非它不支持   并行度至少为两级,在这种情况下,新的Thread是   创建用于运行每个任务)。

因此,隐式或显式地使用池(好吧,除非你有一个核心机器,这些天很少见)。我不建议创建一个包含1000个线程的池。

如果您只想对所有这些异步调用使用单个线程,则可以使用Executors.newSingleThreadExecutor()并将其作为参数传递(只记得使用相同的执行程序)。

答案 1 :(得分:3)

如果您在未指定线程池的情况下安排计算,则会使用fork-join公共池,否则您可以指定自己的ExecutorsupplyAsync并选择适合的大小你的需要。

答案 2 :(得分:-1)

尝试使用CompletableFuture.thenCompose() 以异步方式顺序运行多个Future。