CompletableFuture

简介: CompletableFuture

一个能思想的人,才真是一个力量无边的人。——巴尔扎克

我们之前使用异步

public static ExecutorService executor = Executors.newFixedThreadPool(10);
    final Future<Integer> submit = executor.submit(new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {
            print("原始异步Callable");
            return 1;
        }
    });
    executor.execute(new Runnable() {
        @Override
        public void run() {
            LineUtils.print("原始异步Runnable");
        }
    });

现在咱们使用1.8CompletableFuture

package com.ruben;
import java.util.concurrent.*;
/**
 * @ClassName: CompletableFutureDemo
 * @Description: 我还没有写描述
 * @Date: 2021/3/9 0009 21:13
 * *
 * @author: <achao1441470436@gmail.com>
 * @version: 1.0
 * @since: JDK 1.8
 */
public class CompletableFutureDemo {
    public static ExecutorService executor = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
        final CompletableFuture<Integer> async = CompletableFuture.supplyAsync(() -> {
            System.out.println("1.8新版CompletableFuture调用Callable");
            return 1;
        });
        final CompletableFuture<Void> future = CompletableFuture.runAsync(new Runnable() {
            @Override
            public void run() {
                System.out.println("1.8新版CompletableFuture调用Runnable");
            }
        });
        // 等待并获取结果
        future.get();
        // 在1秒后直接获取结果
        future.get(1, TimeUnit.SECONDS);
        // 立马获取结果,如果获取不到则等待完成再获取结果
        future.getNow(CompletableFuture.allOf(future).get());
        // 获取依赖任务数
        future.getNumberOfDependents();
        menu();
    }
    private static void menu() throws InterruptedException, ExecutionException {
        // 无需返回值 5
        CompletableFuture.runAsync(CompletableFutureDemo::runnable, executor);
        CompletableFuture<Integer> future = CompletableFuture
                // 带返回值 5
                .supplyAsync(CompletableFutureDemo::supplier, executor)
                // 成功执行后触发 5
                .whenComplete(CompletableFutureDemo::biConsumer)
                // 异常时触发
                .exceptionally(CompletableFutureDemo::function)
                // 结束时触发 1
                .handle(CompletableFutureDemo::biFunction);
        System.out.println(future.get());
        // 串行
        // 任务结束后执行 无返回值 不需要上次线程执行结果
        future.thenRun(CompletableFutureDemo::runnable);
        // 任务结束后执行 无返回值 需要上次线程执行结果
        future.thenAccept(CompletableFutureDemo::consumer);
        // 使用指定线程池创建线程异步执行带返回值 需要上次线程执行结果
        Integer integer = future.thenApplyAsync(CompletableFutureDemo::function, executor).get();
        System.out.println(integer);
        // 两个任务都完成后 使用当前线程池创建线程异步执行 无返回值 不需要两个任务执行结果
        future.runAfterBothAsync(future, CompletableFutureDemo::runnable);
        // 两个任务都完成后执行 无返回值 需要两个任务执行结果
        future.thenAcceptBoth(future, CompletableFutureDemo::biConsumer);
        // 两个任务都完成后执行 带返回值 需要两个任务执行结果
        future.thenCombine(future, CompletableFutureDemo::biFunction);
        // 两个任务只要有一个执行完成就执行 无返回值 不需要上次线程执行结果
        future.runAfterEither(future, CompletableFutureDemo::runnable);
        // 两个任务只要有一个执行完成就执行 无返回值 需要上次线程执行结果
        future.acceptEither(future, CompletableFutureDemo::consumer);
        // 两个任务只要有一个执行完成就执行 带返回值 需要上次线程执行结果
        future.applyToEither(future, CompletableFutureDemo::function);
        // 任何一个执行完成
        CompletableFuture.anyOf(future, future, future).get();
        // 等待所有结果完成
        CompletableFuture.allOf(future, future, future).get();
    }
    public static Integer function(Throwable throwable) {
        System.out.println("function:" + Thread.currentThread().getId());
        return 0;
    }
    public static Integer function(Integer integer) {
        System.out.println("function:" + Thread.currentThread().getId());
        System.out.println(integer);
        integer++;
        return integer;
    }
    public static Integer biFunction(Integer integer, Throwable throwable) {
        System.out.println("biFunction:" + Thread.currentThread().getId());
        return 1;
    }
    public static Integer biFunction(Integer integer, Integer integer1) {
        System.out.println("biFunction:" + Thread.currentThread().getId());
        return integer + integer1;
    }
    public static void consumer(Integer integer) {
        System.out.println("consumer:" + Thread.currentThread().getId());
        function(integer);
    }
    public static void biConsumer(Integer integer, Throwable throwable) {
        System.out.println("biConsumer:" + Thread.currentThread().getId());
        consumer(integer);
        throw new RuntimeException();
    }
    public static void biConsumer(Integer integer, Integer integer1) {
        System.out.println("biConsumer:" + Thread.currentThread().getId());
        System.out.println(integer + integer1);
    }
    public static int supplier() {
        System.out.println("supplier:" + Thread.currentThread().getId());
        int i = 10 / 2;
        System.out.println(i);
        return i;
    }
    public static void runnable() {
        System.out.println("runnable:" + Thread.currentThread().getId());
        supplier();
    }
}
相关文章
|
7月前
|
缓存 Java Maven
CompletableFuture
【7月更文挑战第29天】
63 4
|
7月前
|
Java 开发者 Spring
CompletableFuture 使用总结
CompletableFuture 使用总结
207 1
|
7月前
|
存储 缓存 安全
(八)深入并发之Runnable、Callable、FutureTask及CompletableFuture原理分析
关于Runnable、Callable接口大家可能在最开始学习Java多线程编程时,都曾学习过一个概念:在Java中创建多线程的方式有三种:继承Thread类、实现Runnable接口以及实现Callable接口。但是实则不然,真正创建多线程的方式只有一种:继承Thread类,因为只有`new Thread().start()`这种方式才能真正的映射一条OS的内核线程执行,而关于实现Runnable接口以及实现Callable接口创建出的Runnable、Callable对象在我看来只能姑且被称为“多线程任务”,因为无论是Runnable对象还是Callable对象,最终执行都要交由Threa
158 1
|
6月前
CompletableFuture 打桌球的应用
CompletableFuture 打桌球的应用
28 0
|
6月前
|
Java 测试技术
CompletableFuture 使用
CompletableFuture 使用
73 0
|
9月前
|
Java API
java多线程之FutureTask、Future、CompletableFuture
java多线程之FutureTask、Future、CompletableFuture
404 0
|
Java
CompletableFuture总结和实践
CompletableFuture被设计在Java中进行异步编程。异步编程意味着在主线程之外创建一个独立的线程,与主线程分隔开,并在上面运行一个非阻塞的任务,然后通知主线程进展,成功或者失败。
399 0
|
消息中间件 Java 中间件
Future and CompletableFuture
Future代表异步执行的结果,也就是说异步执行完毕后,结果保存在Future里, 我们在使用线程池submit()时需要传入Callable接口,线程池的返回值为一个Future,而Future则保存了执行的结果 ,可通过Future的get()方法取出结果,如果线程池使用的是execute(),则传入的是Runnable接口 无返回值。
89 0
|
Java 调度
并发编程——Future & CompletableFuture
Java创建线程的方式,一般常用的是Thread,Runnable。如果需要当前处理的任务有返回结果的话,需要使用Callable。Callable运行需要配合Future。
75 0
|
Java 测试技术
CompletableFuture使用详解
CompletableFuture是jdk8的新特性。CompletableFuture实现了CompletionStage接口和Future接口
301 0
CompletableFuture使用详解