笑了,面试官问我知不知道异步编程的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的工作原理,并讨论其在异步编程中的应用
30 0
|
前端开发 JavaScript
前端开发面试题—JavaScript回调函数与异步编程
今天分享一下我遇到的一个面试题,是关于JavaScript回调函数的问题,什么是JavaScript回调函数?
158 0
前端开发面试题—JavaScript回调函数与异步编程
|
Java
笑了,面试官问我知不知道异步编程的Future。 (4)
笑了,面试官问我知不知道异步编程的Future。 (4)
93 0
笑了,面试官问我知不知道异步编程的Future。 (4)
|
Java
笑了,面试官问我知不知道异步编程的Future。 (2)
笑了,面试官问我知不知道异步编程的Future。 (2)
150 0
笑了,面试官问我知不知道异步编程的Future。 (2)
|
Dubbo Java 应用服务中间件
笑了,面试官问我知不知道异步编程的Future。 (1)
笑了,面试官问我知不知道异步编程的Future。 (1)
98 0
笑了,面试官问我知不知道异步编程的Future。 (1)
|
消息中间件 Java 微服务
消息队列面试解析系列(六)- 异步编程妙用(下)
消息队列面试解析系列(六)- 异步编程妙用
169 0
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
16天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
17天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
41 4
|
1月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
74 2
下一篇
无影云桌面