CompletableFuture的acceptEitherAsync:哪个线程跑的最快用那个

简介: CompletableFuture的acceptEitherAsync:哪个线程跑的最快用那个acceptEitherAsync:假设两个线程A和B,不确定A和B哪个最快执行完毕返回, 但是需要使用最快执行完毕的线程返回的结果。

CompletableFuture的acceptEitherAsync:哪个线程跑的最快用那个


acceptEitherAsync:假设两个线程A和B,不确定A和B哪个最快执行完毕返回, 但是需要使用最快执行完毕的线程返回的结果。那么就可以使用代码:

private void test() {
    System.out.println("开始...");

    CompletableFuture.supplyAsync(new Supplier<String>() {
        @Override
        public String get() {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("返回 A");
            return "A";
        }
    }).acceptEitherAsync(CompletableFuture.supplyAsync(new Supplier<String>() {
        @Override
        public String get() {
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("返回 B");
            return "B";
        }
    }), new Consumer<String>() {
        @Override
        public void accept(String s) {
            System.out.println("最快返回的:" + s);
        }
    });
}

代码运行输出:

07-02 14:28:02.766 30166-30166/zhangphil.test I/System.out: 开始...
07-02 14:28:03.770 30166-30193/zhangphil.test I/System.out: 返回 A
07-02 14:28:03.772 30166-30193/zhangphil.test I/System.out: 最快返回的:A
07-02 14:28:07.771 30166-30194/zhangphil.test I/System.out: 返回 B


线程A仅需1秒即返回执行结果,而线程B需要长达5秒执行完毕才返回结果,那么就采用线程A执行的结果。


相关文章
|
5月前
|
存储 Java
高并发编程之多线程锁和Callable&Future 接口
高并发编程之多线程锁和Callable&Future 接口
69 1
|
4月前
|
安全 Java API
Java并发基础-启动和终止线程
Java并发基础-启动和终止线程
31 0
|
3月前
|
存储 缓存 安全
(八)深入并发之Runnable、Callable、FutureTask及CompletableFuture原理分析
关于Runnable、Callable接口大家可能在最开始学习Java多线程编程时,都曾学习过一个概念:在Java中创建多线程的方式有三种:继承Thread类、实现Runnable接口以及实现Callable接口。但是实则不然,真正创建多线程的方式只有一种:继承Thread类,因为只有`new Thread().start()`这种方式才能真正的映射一条OS的内核线程执行,而关于实现Runnable接口以及实现Callable接口创建出的Runnable、Callable对象在我看来只能姑且被称为“多线程任务”,因为无论是Runnable对象还是Callable对象,最终执行都要交由Threa
|
5月前
|
消息中间件 监控 前端开发
面试官:核心线程数为0时,线程池如何执行?
线程池是 Java 中用于提升程序执行效率的主要手段,也是并发编程中的核心实现技术,并且它也被广泛的应用在日常项目的开发之中。那问题来了,如果把线程池中的核心线程数设置为 0 时,线程池是如何执行的? 要回答这个问题,我们首先要了解在正常情况下,线程池的执行流程,也就是说当有一个任务来了之后,线程池是如何运行的? ## 1.线程池的执行流程 正常情况下(核心线程数不为 0 的情况下)线程池的执行流程如下: 1. **判断核心线程数**:先判断当前工作线程数是否大于核心线程数,如果结果为 false,则新建线程并执行任务。 2. **判断任务队列**:如果大于核心线程数,则判断任务队列是否
126 1
面试官:核心线程数为0时,线程池如何执行?
|
5月前
|
Java 调度
Java 多线程系列Ⅰ(创建线程+查看线程+Thread方法+线程状态)
Java 多线程系列Ⅰ(创建线程+查看线程+Thread方法+线程状态)
|
Java 调度
线程池如何知道一个线程的任务已经执行完成
线程池如何知道一个线程的任务已经执行完成
472 0
|
12月前
|
Java
【JavaSE专栏83】线程插队,一个线程在另一个线程执行特定任务之前先执行
【JavaSE专栏83】线程插队,一个线程在另一个线程执行特定任务之前先执行
|
Java
Java并发计算判断线程池中的线程是否全部执行完毕
Java并发计算判断线程池中的线程是否全部执行完毕
90 0
|
Java API
既然阻塞 I/O 会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成。这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态是处于 RUNNABLE,这就和上面说的存在矛盾,为什么会这样? 上面的矛盾其实是混淆了操作系统线程状态与 Java 线程状态。这里说的线程阻塞进入休眠状态,其实是操作系统层面线程实际状态。而我们使用 jstack 查看的线程状态却是 JVM 中的线程状态。 线程是操作系统中一种概念,Java 对其进行了封装,Java 线程本质上就是操作系统的中线程,其状态与操作系统的状态大致相同,但还是存在
既然阻塞 I/O 会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
|
Java
【java】主线程等待子线程执行结束后再执行,线程池
【java】主线程等待子线程执行结束后再执行,线程池
172 0