有以下列表,
List<String> shardingList = new ArrayList();
shardingList.add("tb1");
shardingList.add("tb2");
shardingList.add("tb3");
shardingList.add("tb4");
shardingList.add("tb5");
shardingList.add("tb6");
shardingList.add("tb7");
shardingList.add("tb8");
异步执行
List<Future<?>> futures = Lists.newArrayList();
for (int i = 0; i < shardingList.size(); i++) {
int finalI = i;
Future<?> future = shardingTableExecutor.submit(() -> {
// 执行具体的任务并返回结果
this.doTask(shardingList.get(finalI), finalI);
});
futures.add(future);
}
但是tb8的元素,却被执行了2遍,
是什么原因呢?
解决
以下2种方式都可以
List<Future<?>> futures = new ArrayList<>();
IntStream.range(0, shardingList.size())
.forEach(i -> {
Future<?> future = shardingTableExecutor.submit(() -> {
this.doTask(shardingList.get(i), i);
});
futures.add(future);
});
List<Future<?>> futures = Lists.newArrayList();
AtomicInteger index = new AtomicInteger();
for (String tableName : shardingList) {
Future<?> future = shardingTableExecutor.submit(() -> {
this.doTask(tableName, index.getAndIncrement());
});
futures.add(future);
}