gpt4 book ai didi

java - 多线程最佳实践: constraining tasks newFixedThreadPool

转载 作者:行者123 更新时间:2023-12-02 07:56:47 25 4
gpt4 key购买 nike

我想启动很多任务来在 +-42Mio 记录的数据库上运行。我想以 5000 条记录/时间的批处理运行此程序(结果为 850 个任务)。我还想限制 java 开始为我执行此操作的线程数(最多 16 个),并且我正在使用当前代码来完成此任务:

 ExecutorService executorService = Executors.newFixedThreadPool(16);
for (int j = 1; j < 900 + 1; j++) {
int start = (j - 1) * 5000;
int stop = (j) * 5000- 1;
FetcherRunner runner = new FetcherRunner(routes, start, stop);
executorService.submit(runner);

Thread t = new Thread(runner);
threadsList.add(t);
t.start();
}

这是正确的方法吗?特别是我的印象是 java 只是解雇所有任务...(FetcherRunner 实现 runnable)

最佳答案

使用 ExecutorService 的第一部分看起来不错:

...
FetcherRunner runner = new FetcherRunner(routes, start, stop);
executorService.submit(runner);

带有线程的部分不应该在那里,我假设你把它放在那里只是为了展示你之前是如何拥有它的?

更新:是的,您不需要 executorService.submit(runner) 之后的代码,这最终会产生大量线程。如果您的目标是在循环后等待所有提交的任务完成,那么您可以在提交任务时获取对Future的引用并等待Future,如下所示:

ExecutorService executorService = Executors.newFixedThreadPool(16);
List<Future<Result>> futures = ..;
for (int j = 1; j < 900+ 1; j++) {
int start = (j - 1) * 5000;
int stop = (j) * 5000- 1;
FetcherRunner runner = new FetcherRunner(routes, start, stop);
futures.add(executorService.submit(runner));

}
for (Future<Result> future:futures){
future.get(); //Do something with the results..
}

关于java - 多线程最佳实践: constraining tasks newFixedThreadPool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11533134/

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