多线程最佳实践:约束任务newFixedThreadPool
我想启动许多要在+
-42Mio记录的数据库上运行的任务。我想批量运行5000条记录/时间(结果是850个任务)。我还想将线程数限制为16个,因此Java开始为我执行此操作,并且我正在使用当前代码来完成此任务:
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);
带有Thread的部分不应该在那儿,我假设您在那儿只是为了展示您以前的经历?
更新:
是的,您不需要之后的代码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.. }
-
在多线程环境中使用HttpClient的最佳实践
2021-01-31 关注 0 浏览93 1答案
-
Java 中,编写多线程程序的时候你会遵循哪些最佳实践?
2021-10-21 关注 0 浏览205 1答案
-
线程数组的最佳实践(java)
2021-01-30 关注 0 浏览72 1答案
-
线程数组的最佳实践(java)
2021-01-30 关注 0 浏览62 1答案
-
安全地引发事件线程-最佳实践
2021-02-02 关注 0 浏览81 1答案
-
ViewModel 最佳实践
2022-07-28 关注 0 浏览18 1答案
-
适用于应永久运行的任务的Java Executor最佳实践
2021-01-30 关注 0 浏览55 1答案
-
SQL命名最佳实践
2021-04-20 关注 0 浏览92 1答案
-
休眠性能最佳实践?
2021-02-01 关注 0 浏览108 1答案
-
selenium,Nunit最佳实践?
2021-02-01 关注 0 浏览89 1答案