Java CompletableFuture.runAsync vs CompletableFuture的数组

Java CompletableFuture.runAsync vs CompletableFuture的数组,java,multithreading,completable-future,java-threads,Java,Multithreading,Completable Future,Java Threads,我在一个项目中发现了以下代码: int threadCount = 10; CompletableFuture<?>[] futures = new CompletableFuture<?>[threadCount]; for (int i = 0; i < threadCount; i++) { futures[i] = CompletableFuture.runAsync(() -> { process.run(queue); }); } // W

我在一个项目中发现了以下代码:

int threadCount = 10;
CompletableFuture<?>[] futures = new CompletableFuture<?>[threadCount];
for (int i = 0; i < threadCount; i++) {
    futures[i] = CompletableFuture.runAsync(() -> { process.run(queue); });
}
// Wait all futures
CompletableFuture.allOf(futures).join();
谢谢你的解释

int threadCount = 10;
CompletableFuture<?>[] futures = new CompletableFuture<?>[threadCount];
for (int i = 0; i < threadCount; i++) {
    futures[i] = CompletableFuture.runAsync(() -> { process.run(queue); });
}
// Wait all futures
CompletableFuture.allOf(futures).join();
在本例中,您正在指定的线程池中执行代码

这些代码块之间的差异

  • 它们在不同的线程池中执行(第一个在公共ForkJoin中,这是可完成未来的默认值,第二个在指定的线程池中)
  • 在第一种情况下,您正在等待一组任务完成,而在第二种情况下,您只是异步运行任务

好的,您的第二个代码段既使用自定义的
执行器(而第一个代码段使用通用的
ForkJoinPool
),也不会等待
CompletableFuture
完成(与第一个代码段不同,它也只启动一个任务)。后者创建一个任务,它在一个具有10个可用线程的执行器上运行(即9个浪费线程,除非您在后续代码中提交多次),前者创建10个任务(通常使用公共池)。@Michael在
进程中运行(队列)
队列是一个具有许多元素的
阻塞队列
,因此具有
CompletableFuture.runAsync()->{process.run(queue);},线程池)
每个线程都不会调用
进程。run(queue)
方法?否。
\runAsync(Runnable,Executor)
使用给定的
执行器执行给定的
Runnable
。请注意,只有一个
Runnable
,这意味着只有一个任务交给
执行者。
ExecutorService
的所有标准实现对每个任务使用一个线程。@akuma8
queue
与执行器和任务执行无关。队列中元素的数量无关紧要。第二种情况是否无用?因为池中只有一个线程将处理该任务。我的意思是,所有线程都不会执行
process.run(queue)
方法。唯一的用途是第二个案例在其他线程中运行
process.run(queue)
(在某些情况下可能有用),但是
CompletableFuture.runAsync
的结果会被忽略,因此这样做没有意义。如果不使用CompletableFuture,也可以获得相同的结果,即
threadPool.submit(()->process.run(queue))
int threadCount = 10;
CompletableFuture<?>[] futures = new CompletableFuture<?>[threadCount];
for (int i = 0; i < threadCount; i++) {
    futures[i] = CompletableFuture.runAsync(() -> { process.run(queue); });
}
// Wait all futures
CompletableFuture.allOf(futures).join();
ExecutorService threadPool = Executors.newFixedThreadPool(threadCount);
CompletableFuture.runAsync(() -> { process.run(queue); }, threadPool );