package test2.complefuture;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
public class TestCompleteFuture {
public static int i = 0;
static CompletableFuture<String> findAccount(String accountId) {
return CompletableFuture.supplyAsync(() -> {
// mock finding account from database
try {
System.out.println(Thread.currentThread().getName() + ":start!");
Thread.sleep((++i) * 1000);
System.out.println(Thread.currentThread().getName() + ":end!");
} catch (InterruptedException e) {
e.printStackTrace();
}
return "account" + accountId;
});
}
public static void batchProcess(List<String> accountIdList) {
// 并行根据accountId查找对应account
List<CompletableFuture<String>> accountFindingFutureList =
accountIdList.stream().map(accountId -> findAccount(accountId)).collect(Collectors.toList());
// 使用allOf方法来表示所有的并行任务
CompletableFuture<Void> allFutures =
CompletableFuture
.allOf(accountFindingFutureList.toArray(new CompletableFuture[accountFindingFutureList.size()]));
//allFutures.join();
// 下面的方法可以帮助我们获得所有子任务的处理结果
CompletableFuture<List<String>> finalResults = allFutures.thenApply(v -> accountFindingFutureList.stream().map(accountFindingFuture -> accountFindingFuture.join())
.collect(Collectors.toList()));
try {
List<String> list = finalResults.get();
System.out.println(list);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("11111");
list.add("22222");
list.add("33333");
batchProcess(list);
}
}
CompleteFuture 并行处理 所有任务执行完后 统一返回结果
最新推荐文章于 2024-04-25 20:36:13 发布