gpt4 book ai didi

java - ExecutorService 具有大量任务

转载 作者:行者123 更新时间:2023-12-02 06:09:23 25 4
gpt4 key购买 nike

我有一个文件列表和一个分析这些文件的分析器列表。文件数量可能很大(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com