我正在处理一个需要以块的形式处理数据的任务。我有一个属性文件,我在其中定义块大小,假设500和我从数据库获得的数据是假设1000条记录。我想使用多线程处理每个块500个记录500个记录。
这是我第一次实现这一点,所以请告诉我是否可以使用其他技术实现相同目标。这背后的主要目的是我正在生成一个excel文件,我在其中填充数据,同时记住块大小。所以可能第一个线程处理500个记录,第二个线程接下来500个。
部分代码(Rest解析xml并使用POI在Excel中写入)
public List<NYProgramTO> getNYPPAData() throws Exception {
this.getConfiguration();
List<NYProgramTO> to = dao.getLatestNYData();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document document = null;
// Returns chunkSize
List<NYProgramTO> myList = getNextChunk(to);
ExecutorService executor = Executors.newFixedThreadPool(myList.size());
myList.stream()
.forEach((NYProgramTO nyTo) ->
{
executor.execute(new NYExecutorThread(nyTo, migrationConfig , appContext, dao));
});
executor.shutdown();
executor.awaitTermination(300, TimeUnit.SECONDS);
System.gc();
dao.getLatestNYData();
方法返回数据库中的记录总数,这就是我填充列表to
的方式。
我有以下方法给了我下一组块,所以假设如果处理了500条记录,这个方法应该给下一条500条记录进行处理(希望这是有道理的)。
private static List<NYProgramTO> getNextChunk(List<NYProgramTO> list) {
currentIndex = 0; // This is static int class variable
List<NYProgramTO> nyList = new ArrayList<>();
if(list.size() == 0) {
return list;
}
int totalCount = list.size();
for(int i = currentIndex; i < (currentIndex + chunkSize); i++) {
if(i == totalCount) break;
nyList.add(list.get(i));
}
return nyList;
}
在我的第一个方法中,我现在在这里创建线程我不确定需要创建多少个线程。目前我正在通过getNextChunk();
方法收到的列表大小。
NYExecutorThread
这个类只是实现了Runnable,我还没有任何逻辑。目前,我只是在构造函数上传递参数,以便能够获取配置并创建线程。
这有点令人困惑,我想如果有人实施了这样的逻辑,请告诉我如何才能继续这样做?
由于