package CompletableFuture;
import java.util.Arrays;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.concurrent.*;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* @author chao
* @version 1.0
* @date 2022/4/15 3:38 下午
*/
public class CompletableFutureTest6 {
public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
List<CompletableFuture<Integer>> list = Arrays.asList(
CompletableFuture.supplyAsync(() -> {
cal(2000L);
System.out.println("5 done.");
return 5;
}),
CompletableFuture.supplyAsync(() -> {
throw new RuntimeException();
}),
CompletableFuture.supplyAsync(() -> {
cal(20000L);
System.out.println("42 done.");
return 42;
}),
CompletableFuture.supplyAsync(() -> {
cal(3000L);
System.out.println("15 done.");
return 15;
})
);
Predicate<Integer> condition = i -> i > 14;
CompletableFuture<Integer> integerCompletableFuture = anyMatch(list, condition);
System.out.println(integerCompletableFuture.get(5, TimeUnit.SECONDS));
// CompletableFuture<Void> voidCompletableFuture = anyMatch(list, i -> i > 14)
// .thenAccept(i -> System.out.println("got " + i))
// .whenComplete((x, t) -> {
// if (t != null) t.printStackTrace();
// });
// voidCompletableFuture.get();
System.out.println("main done");
}
public static <T> CompletableFuture<T> anyMatch(
List<? extends CompletionStage<? extends T>> l, Predicate<? super T> criteria) {
CompletableFuture<T> result = new CompletableFuture<>();
Consumer<T> whenMatching = v -> {
if (criteria.test(v)) result.complete(v);
};
CompletableFuture.allOf(l.stream()
.map(f -> f.thenAccept(whenMatching)).toArray(CompletableFuture<?>[]::new))
.whenComplete((ignored, t) ->
result.completeExceptionally(t != null ? t : new NoSuchElementException()));
return result;
}
public static Boolean cal(Long p) {
System.out.println(Thread.currentThread().getName() + "cal....");
try {
Thread.sleep(p);
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
}
ForkJoinPool.commonPool-worker-9cal....
ForkJoinPool.commonPool-worker-2cal....
ForkJoinPool.commonPool-worker-11cal....
5 done.
15 done.
got 15
main done