gpt4 book ai didi

java - 创建x个线程,然后等待完成

转载 作者:行者123 更新时间:2023-11-30 05:17:47 24 4
gpt4 key购买 nike

我正在编写一个控制台应用程序来读取 json 文件,然后对它们进行一些处理。我有 200k 个 json 文件要处理,所以我为每个文件创建一个线程。但我希望只运行 30 个 Activity 线程。我不知道如何用Java来控制它。

这是我到目前为止的代码:

 for (String jsonFile : result) {

final String jsonFilePath = jsonFile;
Thread thread = new Thread(new Runnable() {

String filePath = jsonFilePath;

@Override
public void run() {
// Do stuff here
}
});
thread.start();
}

result是一个包含 200k 个文件路径的数组。从这一点来看,我不知道如何控制它。我想到了List<Thread>然后在每个线程中实现一个通知程序,当它们完成时,只需从列表中删除即可。但随后我必须让主线程 hibernate 然后唤醒。这感觉很奇怪。

我怎样才能实现这个目标?

最佳答案

我建议不要为每个文件创建一个线程。线程是有限的资源。创建太多可能会导致饥饿甚至程序中止。

根据提供的信息,我将使用 ThreadPoolExecutor 。由于 Executors::newFixedSizeThreadPool ,用有限数量的线程构建这样的执行器非常简单。 :

ExecutorService service = Executors.newFixedSizeThreadPool(30);

查看 ExecutorService -interface ,方法 <T> Future<T> submit​(Callable<T> task) 可能很合适。

为此,需要进行一些更改。任务(即给定实现中当前的 Runnable )必须转换为 Callable<T> ,其中T应该用返回类型替换。 Future<T> 返回的结果应该被收集到一个列表中并等待。当全部Future s 完成后,可以构建结果列表,例如通过流媒体。

关于java - 创建x个线程,然后等待完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60100956/

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