我有一个场景,我想读取一个由大约2000条记录组成的电子表格,并将其输入到数据库中。
目前我们使用的是Executor框架。我们的限制是任务数只有5。每个任务从excel中读取20行数据。我们提供要从excel读取到每个任务的行的起始索引和结束索引。
比如说,目前,
任务1处理1-20个任务
任务-2处理21-40
任务-3处理41-60
任务-4句柄61-80
Task-5处理81-100
如果Task-1完成执行,它将占用接下来的20行,即101-120行。
假设如果Task-2在Task-1之前完成,它将从121-140开始读取,而不是101-120。
在Fork-Join框架中,我是否可以更有效地处理这个场景,只有5个任务,每个任务20行?
需要深入了解性能问题。
发布于 2016-02-12 18:39:24
不需要切换线程池。为了使负载更加均衡,您可以只维护指向第一个未采用行的原子变量:
AtomicInteger currentRow = new AtomicInteger(); // shared between tasks
final int maxRow = 2000;
final int batchSize = 20;
// Inside every task:
while(true) {
int row = currentRow.getAndAdd(batchSize);
if(row >= maxRow) return;
int from = row+1;
int to = Math.min(row+batchSize, maxRow);
// process rows from..to; it's guaranteed that other threads
// do not process the same rows.
}每个任务的主体都是完全相同的。此外,此实现不依赖于创建的任务数量。如果您稍后决定有3个任务或7个任务,只需调整线程池大小并提交更多(或更少)任务即可。
https://stackoverflow.com/questions/35359904
复制相似问题