int dataSizePerThread = awardIds.size() / threadNum; 这段代码可能为空 再优化一下
时间: 2024-02-28 22:54:26 浏览: 57
Java-多线程异步请求统一响应结果.docx
确实,如果`awardIds`的大小小于线程数,则会出现`dataSizePerThread`为0的情况。可以在计算`dataSizePerThread`时,加上一个最小值的限制,避免出现0的情况。代码改进后如下:
```
int threadNum = 10;
int dataSizePerThread = Math.max(1, awardIds.size() / threadNum);
List<CompletableFuture<List<TCaAwardInfo>>> futures = new ArrayList<>();
for (int i = 0; i < threadNum; i++) {
int startIndex = i * dataSizePerThread;
int endIndex = Math.min((i + 1) * dataSizePerThread, awardIds.size());
List<Long> subList = awardIds.subList(startIndex, endIndex);
CompletableFuture<List<TCaAwardInfo>> future = CompletableFuture.supplyAsync(() -> {
List<TCaAwardInfo> result = new ArrayList<>();
List<TCaAwardInfo> tCaAwardInfos = awardApiService.queryActivationCode(subList);
result.addAll(tCaAwardInfos);
return result;
}, taskExecutor);
futures.add(future);
}
List<TCaAwardInfo> activationCodeList = new ArrayList<>();
for (CompletableFuture<List<TCaAwardInfo>> future : futures) {
activationCodeList.addAll(future.join());
}
```
这样,即使`awardIds`的大小小于线程数,也能保证每个线程都有数据处理,避免了线程空跑的情况。
阅读全文