Java使用FutureTask实现预加载的示例详解

 更新时间:2023年06月20日 11:45:50   作者:海塔灯  
基于FutureTask的特性,通常可以使用FutureTask做一些预加载工作,比如一些时间较长的计算等,本文就来和大家讲讲具体实现方法吧,感兴趣的可以了解一下

FutureTask介绍

FutureTask也可以用作闭锁;FutureTask的计算是通过Callable来实现的,相当于一种可生成结果的Runnable,并且可以处于3种状态,分别是等待运行(waiting to run)正在运行(Running)、和运行完成(Completed),而运行完成表示计算的所有可能结束方式,包括正常结束由于取消而结束由于异常而结束等,当FutureTask进入完成状态后,它就会永远停止在这个状态上。我们可以使用Future.get()方法获取任务执行的状态。

使用场景

Future.get的行为取决于任务的状态,如果任务已经完成,那么get会立即返回结果,否则get方法将阻塞直到任务进入完成状态,然后返回结果或者抛出异常,FutureTask将计算结果从执行计算的线程传递到获取这个结果的线程,而FutureTask的规范确保了这种传递过程能实现结果的正确性

基于FutureTask的特性,通常可以使用FutureTask做一些预加载工作,比如一些时间较长的计算,这些计算可以在使用计算结果之前启动,并且计算的结果将在稍后是同,通过提前启动计算,可以减少等待结果时需要的时间

实例解析

假设我们要加载一个产品信息,使用FutureTask来执行一个高开销的计算。代码如下所示: 首先简单写一个产品的Bean类:

    static class ProductInfo {
        public ProductInfo(String name, String order_id) {
            this.name = name;
            this.order_id = order_id;
        }
        private String name;
        private String order_id;
        @Override
        public String toString() {
            return "ProductInfo{" +
                    "name='" + name + '\'' +
                    ", order_id='" + order_id + '\'' +
                    '}';
        }
    }

然后使用FutureTask实现一个产品信息预加载功能:

    static class Preloader {
        public void start() {
            thread.start();
        }
        private final FutureTask<ProductInfo> futureTask =
                new FutureTask<>(new Callable<ProductInfo>() {
                    @Override
                    public ProductInfo call() throws Exception {
                        return loadProductInfo();
                    }
                });
        public ProductInfo get() throws ExecutionException, 
        InterruptedException {
            return futureTask.get();
        }
        private final Thread thread = new Thread(futureTask);
        private ProductInfo loadProductInfo() {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return new ProductInfo("衣服", "9527");
        }
    }

验证代码:

    Preloader preloader = new Preloader();
        preloader.start();
        System.out.println("start get product info before"
         + System.currentTimeMillis() / 1000);
        ProductInfo productInfo = null;
        try {
            productInfo = preloader.get();
        } catch (ExecutionException | InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("start get product info afte" 
        +System.currentTimeMillis() / 1000);
        System.out.println("productInfo: " + productInfo);

如上面的代码所示:Preloader创建了一个FutureTask,其中包含了加载产品信息的任务,以及一个执行运算的线程。我们增加了一个 Thread.sleep(5000);模拟加载耗时。由于在构造函数或者静态初始化方法中启动线程不是一种好方法,所以提供了一个start方法来启动线程,当程序后面需要ProductInfo结果时,可以调用Preloader提供的get方法,如果数据已经加载,那么会返回这些数据,否则将等待加载完成后再返回。

到此这篇关于Java使用FutureTask实现预加载的示例详解的文章就介绍到这了,更多相关Java FutureTask预加载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot项目启动自动跳转到浏览器的操作代码

    springboot项目启动自动跳转到浏览器的操作代码

    这篇文章主要介绍了springboot项目启动自动跳转到浏览器的操作代码,本文图文实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • Mybatis实现分页查询的详细流程

    Mybatis实现分页查询的详细流程

    这篇文章主要给大家介绍了关于Mybatis实现分页查询的详细流程,MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架,需要的朋友可以参考下
    2023-08-08
  • Java中BM(Boyer-Moore)算法的图解与实现

    Java中BM(Boyer-Moore)算法的图解与实现

    本文主要介绍了两个大的部分,第一部分通过图解的方式讲解BM算法,第二部分则代码实现一个简易的BM算法,感兴趣的小伙伴可以学习一下
    2022-05-05
  • 深入理解Java中的类加载器原理

    深入理解Java中的类加载器原理

    这篇文章主要介绍了深入理解Java中的类加载器原理,类加载器负责加载所有的类,系统为所有被载入内存中的类生成一个java.lang.Class实例,需要的朋友可以参考下
    2024-01-01
  • Java多线程知识点全面总结

    Java多线程知识点全面总结

    这篇文章主要介绍了Java多线程知识点全面总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java设计通用的返回数据格式过程讲解

    Java设计通用的返回数据格式过程讲解

    现在很多的项目server端返回client端的数据多数以JSON格式返回,同时结合其它需要,通常加一下状态码和信息之类,给前端处理带来很大的方便,这篇文章就用Java设计了通用的返回数据格式,感兴趣的同学可以参考下文
    2023-05-05
  • 一文解析Java如何连接FTP服务器

    一文解析Java如何连接FTP服务器

    Java 提供了强大的工具和库来实现与 FTP 服务器的连接、文件传输、目录操作等功能,本文将详细介绍如何使用 Java 连接 FTP 服务器,需要的可以参考下
    2024-12-12
  • java为什么使用BlockingQueue解决竞态条件问题面试精讲

    java为什么使用BlockingQueue解决竞态条件问题面试精讲

    这篇文章主要为大家介绍了java为什么使用BlockingQueue解决竞态条件问题面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Java观察者模式之实现对象间的一对多依赖

    Java观察者模式之实现对象间的一对多依赖

    这篇文章主要介绍了Java观察者模式之实现对象间的一对多依赖的方法,Java观察者模式是一种行为型设计模式,用于实现对象之间的消息传递和通信,文中有详细的实现步骤和代码示例,,需要的朋友可以参考下
    2023-05-05
  • JavaWeb如何发送状态码方法解析

    JavaWeb如何发送状态码方法解析

    这篇文章主要介绍了JavaWeb如何发送状态码方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论