java - ExecutorService 具有大量任务

标签 java multithreading threadpool executorservice

我有一个文件列表和一个分析这些文件的分析器列表。文件数量可能很大(200,000 个),分析器数量可能很大(1000 个)。因此操作总数可能非常大(200,000,000)。现在,我需要应用多线程来加快速度。我遵循了这种方法:

ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
for (File file : listOfFiles) {
  for (Analyzer analyzer : listOfAnalyzers){
    executor.execute(() -> {
      boolean exists = file.exists();
      if(exists){
        analyzer.analyze(file);
      }
    });
  }
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);

但这种方法的问题是它从内存中获取了太多内容,我想有更好的方法来做到这一点。我还是java和多线程的初学者。

最佳答案

200M 任务将驻留在哪里?我希望不在内存中,除非您计划以分布式方式实现您的解决方案。同时,您需要实例化一个 ExecutorService,它不会累积大量队列。当您创建 here 时,与“调用者运行策略”(请参阅​​ service )一起使用。如果您尝试在队列已满时将另一个任务放入队列中,您最终将自己执行它,这可能就是您想要的。

OTOH,既然我更认真地看待你的问题,为什么不同时分析单个文件呢?那么队列永远不会大于分析器的数量。坦率地说,这就是我要做的,因为我想要一个可读的日志,其中在我加载每个文件时以正确的顺序包含一条消息。

很抱歉没有提供更多帮助:

analysts.stream().map(analyst -> executor.submit(() -> Analyst.analyze(file))).map(Future::get);

基本上,为单个文件创建一堆 future,然后等待所有这些 future,然后再继续。

关于java - ExecutorService 具有大量任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51084423/

相关文章:

java - 比较数据后得出错误结果

java - 如何使服务器能够接受来自具有不同套接字连接的客户端的多个输入流?

java - 为什么当我使用 'synchronized' 时我的线程没有一个接一个地执行?

windows - std::condition_variable notify_all 不会同时唤醒所有线程

.net - 线程池与专用线程 - 何时选择哪个

java - ThreadPoolExecutor 和 Socket。线程未启动

Java HttpClient 和设计身份验证问题

java - 使用 Apache Batik 调整 svg 文件大小时内存不足

java - 将数组复制到列表

python - 使用函数控制Python线程