笑了,面试官问我知不知道异步编程的Future。 (3)

简介: 笑了,面试官问我知不知道异步编程的Future。 (3)

image.png


image.png


这就相当于异步任务执行过程中抛出了异常,而你只有在调用了 get 方法(打电话操作)之后才知道原来异常了。


而真正的异步是你不用等我,我好了我就叫你。


就像女神接到男神的电话时说的:我需要一点时间准备一下,你先玩自己的吧,我一会好了给你打电话。


这让我想起了好莱坞原则:Don't Call Us,We'll Call you!


接下来,让我们见识一下真正的异步。


什么叫真正的:“你先玩自己的,我一会好了叫你。”


image.png


Guava 的 Future


女神说的:“好了叫你”。


就是一种回调机制。说到回调,那么我们就需要在异步任务提交之后,注册一个回调函数就行。


Google 提供的 Guava 包里面对 JDK 的 Future 进行了扩展:


image.png


新增了一个 addListenter 方法,入参是一个 Runnable 的任务类型和一个线程池。


使用方法,先看代码:


public class JDKThreadPoolExecutorTest {
    public static void main(String[] args) throws Exception {
        ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
        ListenableFuture<String> listenableFuture = executor.submit(() -> {
            System.out.println(Thread.currentThread().getName()+"-女神:我开始化妆了,好了我叫你。");
            TimeUnit.SECONDS.sleep(5);
            return "化妆完毕了。";
        });
        listenableFuture.addListener(() -> {
            try {
                System.out.println(Thread.currentThread().getName()+"-future的内容:" + listenableFuture.get());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, executor);
        System.out.println(Thread.currentThread().getName()+"-等女神化妆的时候可以干点自己的事情。");
        Thread.currentThread().join();
    }
}


首先创建线程池的方式变了,需要用 Guava 里面的 MoreExecutors 方法装饰一下:


ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());


然后用装饰后的 executor 调用 submit 方法(任意一种),就会返回 ListenableFuture


,拿到这个 ListenableFuture 之后,我们就可以在上面注册监听:



image.png


image.png


从运行结果可以看出来:获取运行结果是在另外的线程里面执行的,完全没有阻塞主线程


和之前的“假异步”还是有很大区别的。


除了上面的 addListener 方法外,其实我更喜欢用 FutureCallback 的方式。


image.png


目录
相关文章
|
4月前
|
安全 Java 数据库连接
Java面试题:解释Java内存模型的无锁编程支持,并讨论其优势和局限性,解释Java中的CompletableFuture的工作原理,并讨论其在异步编程中的应用
Java面试题:解释Java内存模型的无锁编程支持,并讨论其优势和局限性,解释Java中的CompletableFuture的工作原理,并讨论其在异步编程中的应用
29 0
|
前端开发 JavaScript
前端开发面试题—JavaScript回调函数与异步编程
今天分享一下我遇到的一个面试题,是关于JavaScript回调函数的问题,什么是JavaScript回调函数?
154 0
前端开发面试题—JavaScript回调函数与异步编程
|
Java
笑了,面试官问我知不知道异步编程的Future。 (4)
笑了,面试官问我知不知道异步编程的Future。 (4)
91 0
笑了,面试官问我知不知道异步编程的Future。 (4)
|
Java
笑了,面试官问我知不知道异步编程的Future。 (2)
笑了,面试官问我知不知道异步编程的Future。 (2)
147 0
笑了,面试官问我知不知道异步编程的Future。 (2)
|
Dubbo Java 应用服务中间件
笑了,面试官问我知不知道异步编程的Future。 (1)
笑了,面试官问我知不知道异步编程的Future。 (1)
96 0
笑了,面试官问我知不知道异步编程的Future。 (1)
|
消息中间件 Java 微服务
消息队列面试解析系列(六)- 异步编程妙用(下)
消息队列面试解析系列(六)- 异步编程妙用
167 0
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
22天前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
50 2
|
26天前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
24 0
|
3月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。