int threadNum = Math.min(50, list.size());ExecutorService executor = Executors.newFixedThreadPool(threadNum);int size = (int) Math.ceil((double) list.size() / threadNum);for (int i = 0; i < threadNum; i++) { int start = i * size; int end = Math.min(list.size(), (i + 1) * size); List<Integer> subList = list.subList(start, end); executor.submit(() -> { // 处理子List的逻辑 });}executor.shutdown();executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);如上代码,当list数据处理完成之后是否应该跳出循环?请说明
时间: 2024-04-26 21:22:39 浏览: 21
这段代码使用了 Java 的线程池技术来处理 list 中的数据,其中 `executor.submit()` 方法会将处理子列表的任务提交到线程池中异步执行。`executor.shutdown()` 方法会关闭线程池,不再接受新的任务,并等待已提交的任务执行完成。`executor.awaitTermination()` 方法会等待所有任务执行完成,这里使用了一个非常大的等待时间 `Long.MAX_VALUE`,确保线程池中的所有任务都能执行完毕。
因此,当 list 数据处理完成之后,程序并不需要跳出循环,因为线程池中的任务会继续执行直到所有任务都执行完成,程序才会跳出 `executor.awaitTermination()` 方法。如果程序在 list 数据处理完成之后跳出循环,可能会导致尚未完成的任务被中断,进而影响程序的正确性和性能。
相关问题
int dataSizePerThread = awardIds.size() / threadNum; 这段代码可能为空 再优化一下
确实,如果`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`的大小小于线程数,也能保证每个线程都有数据处理,避免了线程空跑的情况。
// 分成 10 个线程并行处理数据 int threadNum = 10; int dataSizePerThread = awardIds.size() / threadNum; List<CompletableFuture<List<TCaAwardInfo>>> futures = new ArrayList<>(); for (int i = 0; i < threadNum; i++) { int startIndex = i * dataSizePerThread; int endIndex = (i == threadNum - 1) ? awardIds.size() : (i + 1) * dataSizePerThread; 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); } // 等待所有线程执行完毕 CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); allFutures.join(); // 合并结果 List<TCaAwardInfo> activationCodeList = futures.stream() .flatMap(future -> future.join().stream()) .collect(Collectors.toList()); 优化一下这个代码
这段代码的并行处理数据的逻辑已经很好了,可以考虑在结果合并的时候进行优化。可以使用`CompletableFuture.join()`方法替代`CompletableFuture.join().stream()`,这样可以避免创建Stream对象,提高代码执行效率。同时,可以考虑使用`addAll()`方法替代`flatMap()`和`collect(Collectors.toList())`方法,从而避免创建Stream对象和List对象,提高代码执行效率。代码改进后如下:
```
int threadNum = 10;
int dataSizePerThread = awardIds.size() / threadNum;
List<CompletableFuture<List<TCaAwardInfo>>> futures = new ArrayList<>();
for (int i = 0; i < threadNum; i++) {
int startIndex = i * dataSizePerThread;
int endIndex = (i == threadNum - 1) ? awardIds.size() : (i + 1) * dataSizePerThread;
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());
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)