如何在每次迭代中循环使用执行程序服务?
How to use executor service in loop for each iteration?
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(比方说)batches/pages 的数据,如上面的代码所述。我正在尝试负责获取数据并将页面的事件推送到线程,即 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);
});
}
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(比方说)batches/pages 的数据,如上面的代码所述。我正在尝试负责获取数据并将页面的事件推送到线程,即 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);
});
}