/**
* 对list里的元素并行处理,并待所有任务结束后才停止阻塞
*
* @param list 需要并行处理的元素
* @param consumer 消费元素
* @param timeout 并行处理超时设置
*/
public static <T> void execute(List<T> list, Consumer<T> consumer, int timeout) {
List<CompletableFuture<Void>> futures = new ArrayList<>();
for (T t : list) {
CompletableFuture<Void> f = CompletableFuture.runAsync(() -> {
synchronized (t) {
consumer.accept(t);
}
}, pool1);
futures.add(f);
}
CompletableFuture<Void> all = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
try {
all.get(timeout, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
}
};
在递归中,从第二层开始并行查询数据库或者直接并行查询数据库,最后发现有概率丢失数据
几次相同条件查询的截图如下,所有查询未超时
一次2.29M一次2.28M,反复测试过是可以重现
题主发一下调用的时候的代码。尤其是看看 consumer 对象传的什么内容。