向 ExecutorService 提交任务时并行流如何工作?

问题描述 投票:0回答:1

我是一家软件公司的顾问,负责使用我的开发同事构建的不同工具为我们的客户提供支持。

我对 Java 的经验很少,但我确实阅读代码试图理解它是如何工作的。


我现在正在看一段代码,我不确定我是否理解正确。我向开发者提出了这个问题,等待他的反馈,但我想如果能得到其他反馈会更好。

这是我正在看的作品。我们有一个表(数据库对象)列表,我们需要对每个表执行相同的操作。 同样的操作在

Myclass
中定义,正在实现
Runnable
:

final ExecutorService worker = Executors.newFixedThreadPool(8);
...
List.stream()
    .parallel()
    .filter(table -> table.getRows() > 0 || table.isAutoIncrement())
    .forEach(table -> worker.execute(new Myclass())

这是我的问题:

  1. parallel()
    会将我的流分割成 N 个子流,其中 N = 服务器上的#cpus - 1。没有办法控制流的分割方式,对吗?它会尝试平均分配吗?
  2. 我不明白需要使用
    ExecutorService
    。这是否意味着只有 8 个线程会处理我的 N 个子流?
  3. 我的期望是看到我的 8 个线程始终工作,但在测试过程中,我看到它们一开始正在运行,但随后线程数减少到了 3 个。为什么?这是否意味着目前只剩下 3 个子流需要处理?
java java-stream executorservice
1个回答
4
投票

ExecutorService 将用于处理后台线程中的请求。在您的示例中,您有一个包含 8 个线程的线程池。因此,让我们想象一下这里需要完成的工作需要花费大量时间。这里的代码将通过流工作并将工作交给线程池,然后主线程将继续运行而不等待 executorservice 完成。

据我所知,您无法控制通过 parallel() 调用将流分成多少个子流。老实说,由于您将工作交给线程池,所以我不确定并行()调用是否会为您做很多事情。

© www.soinside.com 2019 - 2024. All rights reserved.