对于问题1,根据ArrayList源代码,
futuresList.toArray(new CompletableFuture[0]) 和futuresList.toArray(new CompletableFuture[futuresList.size()]) 都导致相同的结果。
区别:
1、size=0,ArrayList创建完全需要的大小来容纳新元素。
2、size=futuresList.size(),ArrayList使用提供的数组来保存元素,并测试提供的数组是否还有剩余空间,将a[size]设置为null。
最佳实践:使用 size=0
对于问题 2,一些技巧如下,
static void play() {
List<CompletableFuture<Integer>> all = firstTask();
secondTask();
}
static List<CompletableFuture<Integer>> firstTask() {
CountDownLatch countDownLatch = new CountDownLatch(3);
CompletableFuture<Integer> f1 = CompletableFuture.supplyAsync(() -> {countDownLatch.countDown(); return 1;});
CompletableFuture<Integer> f2 = CompletableFuture.supplyAsync(() -> {countDownLatch.countDown(); return 2;});
CompletableFuture<Integer> f3 = CompletableFuture.supplyAsync(() -> {countDownLatch.countDown(); return 3;});
try {
countDownLatch.await();
} catch (InterruptedException e) {
//
}
return Arrays.asList(f1, f2, f3);
}
static void secondTask() {
System.out.println("do secondTask");
}