JAVA8-CompletableFuture基本用法

admin
2022-11-21 / 0 评论 / 117 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年11月21日,已超过601天没有更新,若内容或图片失效,请留言反馈。

JAVA8-CompletableFuture基本用法

针对<实现一个异步基于事件回调的Future程序> 用CompletableFuture进行改进。

代码示例:

package com.example.study.java8.completableFutures;

import java.util.Optional;
import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * CompletableFuture 基本用法
 */
public class CompletableFutureInAction1 {
    private final static Random RANDOM = new Random(System.currentTimeMillis());
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //实际开发中,一般不直接new,而是使用工厂创建
//        CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync();

        CompletableFuture<Double> completableFuture = new CompletableFuture<>();
        new Thread(()->{
            double value = get();
            completableFuture.complete(value);
        }).start();

        //不会阻塞程序执行
        System.out.println("===========no====block====..");
        //1、后面获取程序执行结果
//        Optional.ofNullable(completableFuture.get()).ifPresent(System.out::println);
        //2、执行完后,通过回调自动返回结果
        completableFuture.whenComplete((v,t)->{
            Optional.ofNullable(v).ifPresent(System.out::println);
            Optional.ofNullable(t).ifPresent(x->x.printStackTrace());
        });
    }

    private static double get(){
        try {
            Thread.sleep(RANDOM.nextInt(10000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return RANDOM.nextDouble();
    }
}

输出结果:

===========no====block====..
0.5192854493861505
2

评论 (0)

取消