美文网首页
CompletableFuture多线程执行,获取到第一个符合期

CompletableFuture多线程执行,获取到第一个符合期

作者: Mrchen_747c | 来源:发表于2022-04-15 17:16 被阅读0次
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

相关文章

网友评论

      本文标题:CompletableFuture多线程执行,获取到第一个符合期

      本文链接:https://www.haomeiwen.com/subject/judqertx.html