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

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

荒腔走板


大家好,我是 why,欢迎来到我连续周更优质原创文章的第 60 篇。


老规矩,先来一个简短的荒腔走板,给冰冷的技术文注入一丝色彩。


上面这图是我五年前,在学校宿舍拍的。


前几天由于有点事情,打开了多年没有打开的 QQ。然后突然推送了一个“那年今日”发送的动态。


这张图片就是那个动态里面的。


2015 年 8 月的时候正是大三放暑假的时间,但是那个暑假我找了一个实习,所以暑假期间住在学校里面。宿舍就我一个人。那个时候我完全没有意识到,这是我程序猿生涯的一个真正的开端,也是我学生时代提前结束的宣告。


8 月 5 日凌晨,一只小猫突然蹿到了宿舍里面,在宿舍里面旁若无人的,像宿管阿姨一样审查着一切东西。甚至直接跳到桌子上,看着我敲代码。完全不怕我的样子。


于是我把它放到了我的自行车上,当模特拍了几张照片。


初见这只小猫时的那种惊喜我还记忆犹新,但是这波回忆杀给我的更大的冲击是:原来,这件事已经过去五年了。


如果没有QQ的这个提醒,你让我想这件事是发生在什么时候的,我的第一反应肯定是好多年前的事情了吧,慢慢咂摸之后有可能才想起,原来是大三暑假的时候的事情,然后再仔细一算,原来是仅仅五年前的事情呀。


短短的五年怎么发生了怎么多事情啊,把这五年塞的满满当当的。


不知道为什么如果把人生求学、步入社会的各个阶段分开来看,我每次回头望的时候都感觉这好像是别人的故事啊。


幸好我自己记录了下来,幸好这真的是我自己的故事。


好了,说回文章。


你就是写了个假异步



先去我的第一篇公众号文章中拿张图片:《Dubbo 2.7新特性之异步化改造》


这是 rpc 的四种调用方式:


image.png


文本主要分享这个 future 的调用方式,不讲 Dubbo 框架,这里只是一个引子。


谈到 future 的时候大家都会想到异步编程。但是你仔细看框起来这里:


image.png


本文将带你从阉割版的 future 聊到升级版的 Google Guava 的 future,最后谈谈加强版的 future 。


先聊聊线程池的提交方式


谈到 Future 的时候,我们基本上就会想到线程池,想到它的几种提交方式。


先是最简单的,execute 方式提交,不关心返回值的,直接往线程池里面扔任务就完事:


public class JDKThreadPoolExecutorTest {
    public static void main(String[] args) throws Exception {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10));
        //execute(Runnable command)方法。没有返回值
        executor.execute(() -> {
            System.out.println("关注why技术");
        });
        Thread.currentThread().join();
    }
}


可以看一下 execute 方法,接受一个 Runnable 方法,返回类型是 void:


image.png


image.png


有三种 submit。这三种按照提交任务的类型来算分为两个类型。


  • 提交执行 Runnable 类型的任务。


  • 提交执行 Callable 类型的任务。


但是返回值都是 Future,这才是我们关心的东西。


也许你知道线程池有三种 submit 方法,但是也许你根本不知道里面的任务分为两种类型,你就只知道往线程池里面扔,也不管扔的是什么类型的任务。


image.png


我们先看一下 Callable 类型的任务是怎么执行的:


public class JDKThreadPoolExecutorTest {
    public static void main(String[] args) throws Exception {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10));
        Future<String> future = executor.submit(() -> {
            System.out.println("关注why技术");
            return "这次一定!";
        });
        System.out.println("future的内容:" + future.get());
        Thread.currentThread().join();
    }
}


这里利用 lambda 表达式,直接在任务体里面带上一个返回值,这时你看调用的方法就变成了这个:



image.png


标号为 ① 的方法扔进去一个 Runable 的任务,返回一个 Future,而这个返回的 Future ,相当于是返回了一个寂寞。下面我会说到原因。


标号为 ② 的方法扔进去一个 Runable 的任务的同时,再扔进去一个泛型 T ,而巧好返回的 Future 里面的泛型也是 T,那么我们大胆的猜测一下这就是同一个对象。如果是同一个对象,说明我们可以一个对象传到任务体里面去一顿操作,然后通过 Future 再次拿到这个对象的。一会就去验证。


来,先验证标号为 ① 的方法,我为啥说它返回了一个寂寞。


首先,还是先把测试案例放在这里:


public class JDKThreadPoolExecutorTest {
    public static void main(String[] args) throws Exception {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10));
        Future<?> future = executor.submit(() -> {
            System.out.println("关注why技术");
        });
        System.out.println("future的内容:" + future.get());
        Thread.currentThread().join();
    }
}


可以看到,确实是调用的标号为 ① 的方法:


image.png




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