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

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

同时,我们也可以看到 future.get() 方法的返回值为 null。


你说,这不是返回了一个寂寞是干啥?


当你想用标号为 ① 的方法时,我劝你直接用 execute 方式提交任务。还不需要构建一个寂寞的返回值,徒增无用对象。


接下来,我们看看标号为 ② 的方法是怎么用的:


public class JDKThreadPoolExecutorTest {
    public static void main(String[] args) throws Exception {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10));
        AtomicInteger atomicInteger = new AtomicInteger();
        Future<AtomicInteger> future = executor.submit(() -> {
            System.out.println("关注why技术");
            //在这里进行计算逻辑
            atomicInteger.set(5201314);
        }, atomicInteger);
        System.out.println("future的内容:" + future.get());
        Thread.currentThread().join();
    }
}


可以看到改造之后,确实是调用了标号为 ② 的方法:


image.png


future.get() 方法的输出值也是异步任务中我们经过计算后得出的 5201314。


你看,渣男就是这样,明明不懂你,还非得用甜言蜜语来轰炸你。呸。


image.png


好了。综上,线程池的提交方式一共有四种:一种 execute,无返回值。三种 submit,有返回值。


submit 中按照提交任务的类型又分为两种:一个是 Callable,一个是 Runable。


submit 中 Runable 的任务类型又有两个重载方法:一个返回了个寂寞,一个返回了个渣男。哦,不。一个返回了个寂寞,一个返回了个对象。


这个时候就有人要站出来说:你说的不对,你就是瞎说,明明就只有 execute 这一种提交方式。


是的,“只有 execute 这一种提交方式”这一种说法也是没错的。


请看源码:


image.png


image.png


写到这里我不禁想起了我的第三篇文章,真是奇怪的时间线开始收缩了的感觉,《有的线程它死了,于是它变成一道面试题》,这篇文章里面聊到了不同提交方式,对于异常的不同处理方式。


我就问你:一个线程池中的线程异常了,那么线程池会怎么处理这个线程?


你要是不知道,可以去看看这篇文章,毕竟,有可能在面试的时候遇到的:


微信图片_20220426205025.png


好,上面这些东西捋清楚了之后。我们再聚焦到返回值 Future 上:


从上面的代码我们可以看出,当我们想要返回值的时候,都需要调用下面的这个 get() 方法:


image.png


image.png


总之就是有可能要等的。只要等,那么就是阻塞。只要是阻塞,就是一个假异步。


所以总结一下这种场景下返回的 Future 的不足之处:


  • 只有主动调用 get 方法去获取值,但是有可能值还没准备好,就阻塞等待。


  • 任务处理过程中出现异常会把异常隐藏,封装到 Future 里面去,只有调用 get 方法的时候才知道异常了。


写到这里的时候我不禁想起一个形象的例子,我给你举一个。


假设你想约你的女神一起去吃饭。女神嘛,肯定是要先画个美美的妆才会出去逛街的。而女神化妆就可以类比为我们提交的一个异步任务。


假设你是一个小屌丝,那么女神就会对你说:我已经开始化妆了,你到楼下了就给我打电话。


然后你就收拾行头准备出发,这就是你提交异步任务后还可以做一些自己的事情。


你花了一小时到了女神楼下,打电话给她:女神你好,我到你楼下了。


女神说:你先等着吧,我的妆还没画好呢。


于是你开始等待,无尽的等待。这就是不带超时时间的 future.get() 方法。

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