java - 如何在每次迭代中循环使用执行器服务?
问题描述
private ExecutorService executorService = Executors.newFixedThreadPool(3);
public void myMethod(){
int batchSize = 2;
// calling for 3 pages to test
for(int i=0;i<3; i++) {
int[] pageNum = {-1};
executorService.execute(() -> {
pageNum[0] = pageNum[0] + 1;
fetchDataAndPushEvents(pageNum[0], batchSize);
});
}
}
private void fetchDataAndPushEvents(int pageNum, int batchSize) {
log.info("Fetching data for page number: {} and batch size: {}", pageNum, batchSize);
long startTime = System.currentTimeMillis();
Pageable pageable = PageRequest.of(pageNum, batchSize);
List<AnswerDto> result = myService.getAllResponse(pageable).getContent();
long secondTime = System.currentTimeMillis();
log.info("Time taken to fetch data for page number: {} and batch size: {} is :{}", pageNum, batchSize, secondTime-startTime);
if(!CollectionUtils.isEmpty(result)) {
log.info("Pushing events for page number: {} and batch size: {}", pageNum, batchSize);
pushSomeEvent(result);
log.info("Time taken to push event for page number: {} and batch size: {} is :{}", pageNum, batchSize, System.currentTimeMillis()-secondTime);
} else {
// to terminate the process
return;
}
}
我的目标是获取上面代码中提到的批量大小为 2(比如)和 3(比如)批量/页面的数据。我试图负责获取数据并将页面的事件推送到一个线程,即 1 个线程用于 1 个页面。我致力于它并能够编写上述逻辑。
但是当我尝试运行上面的代码时,我从getAllResponse
所有三个迭代的存储库调用中得到了相同的 2 响应(作为批量大小)。pageNum
没有更新。获取第 0 页的所有响应,因此在所有 3 次迭代中都会推送相同的事件。我应该如何解决这个问题?PS:我对executorService了解不多。
解决方案
您没有增加 pageNum 它将在每次迭代中具有相同的值。您必须使用单独的计数器变量,如下所示。
int pageNum = 0;
for(int i=0, pageCounter=0;i<3; i++,pageCounter++) {
executorService.execute(() -> {
fetchDataAndPushEvents(pageNum + pageCounter, batchSize);
});
}
推荐阅读
- java - 如何使用移动加速度计计算虚拟球的高度
- sql - 由于字段的时间戳超出标准 SQL 时间戳的范围,无法在 Google BigQuery 中删除或更新行
- java - 严重:异常启动过滤器 ShiroFilter 错误
- android - VFY:register1 v4 type 2,通缉 17
- c - 这是 Vernam Cipher 的 C 代码,如何将数字作为输入消息而不是字符串?
- c++ - 如何在类派生层次结构的所有步骤中调用方法?
- javascript - 使用jquery为每列的textarea添加值
- html - css flex 将可滚动的 div 设置为父级的 100%
- python - 如何确定在顺序模型中添加的层数以使用 Tensorflow 解决多元线性回归问题?
- mysql - 如果 select(*) 计数值为 2,如何更改此查询以返回 true?