Java闭锁之使用FutureTask实现预加载

这篇具有很好参考价值的文章主要介绍了Java闭锁之使用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方法,如果数据已经加载,那么会返回这些数据,否则将等待加载完成后再返回。文章来源地址https://www.toymoban.com/news/detail-473161.html

到了这里,关于Java闭锁之使用FutureTask实现预加载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JUC-线程Callable使用与FutureTask源码阅读

    Callable简单使用 带返回值的线程(实现implements Callable返回值类型),使用示例 FutureTask面向对象方式学习 为了定义这样一个事物“有返回结果”,暂且称之为RunnableFuture。它集合了Runnable和Future两种事物 (其中Future接口 表示了一个任务的生命周期,是一个可取消的异步运算,可

    2024年02月04日
    浏览(35)
  • 如何解决java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@7566d7cf r...

    Java中的 java.util.concurrent.RejectedExecutionException 异常表示无法将任务提交到线程池中执行。这通常是因为线程池处于关闭状态或者已经达到了最大线程数,无法再接受新的任务。 要解决这个异常,你可以考虑以下几种方法: 检查线程池的状态,确保它处于可以接受新任务的状态

    2024年02月13日
    浏览(54)
  • 异步编程 - 04 基于JDK中的Future实现异步编程(上)_Future & FutureTask 源码解析

    这里我们主要探讨如何使用JDK中的Future实现异步编程,这包含 如何使用FutureTask实现异步编程及其内部实现原理; 如何使用CompletableFuture实现异步编程及其内部实现原理, 以及CompletableFuture与JDK Stream如何完美结合的。 在Java并发包(JUC包)中Future代表着异步计算结果,Future中

    2024年02月09日
    浏览(35)
  • Java 中如何实现懒加载

    懒加载是一种常见的优化技术,它可以延迟对象的创建或初始化,直到对象第一次被使用时才进行。这种技术可以帮助我们减少资源的浪费,提高程序的运行效率。 在 Scala 中,我们可以使用 lazy 来定义惰性变量,实现延迟加载(懒加载)。但是在 Java 中,我们需要使

    2024年02月03日
    浏览(28)
  • Open CV 图像处理基础:(一)Open CV 在windows环境初始化和 Java 动态库加载方式介绍

    OpenCV(Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软件库,它提供了一系列的工具和程序库,让用户能够进行复杂的图像处理和计算机视觉任务。以下是一些 OpenCV 常用的功能: 图像读取和保存:读取和保存图像文件,支持多种图像格式。 图像处理:包

    2024年02月01日
    浏览(41)
  • Java sdk使用加载账户私钥调用合约

    1.2 智能合约的流程 1.2 智能合约详细代码 实现了一个简单的商店功能。它定义了三个结构体:用户、商家和商品,以及对应的映射关系。它提供了一些方法用于注册用户和商家,创建商品,更新用户余额,购买商品等等。它还包括一些修饰符,用于限制只有用户或商家可以调

    2023年04月16日
    浏览(39)
  • django使用ztree实现树状结构效果,子节点实现动态加载(l懒加载)

         由于最近项目中需要实现树状结构的效果,考虑到ztree这个组件大家用的比较多,因此打算在django项目中集成ztree来实现树状的效果。最终实现的示例效果如下:         点击父节点,如果有子节点,则从后台动态请求数据,然后显示出子节点的数据。             

    2024年02月14日
    浏览(52)
  • Groovy动态加载Java代码的使用方法和工具类

    你是否遇到过:线上环境复杂,发包申请复杂,代码稳健性差,或者某段代码需要视线上运行情况而更改的!又或者类似解析脚本经常变动,通配符优化等等!更新、打包、发布申请、然后再发布… Groovy则提供了相关的动态加载能力来解决这些问题,并且简单易懂,非常好用

    2024年02月10日
    浏览(44)
  • 并发编程-FutureTask解析

    Future对象大家都不陌生,是JDK1.5提供的接口,是用来以阻塞的方式获取线程异步执行完的结果。 在Java中想要通过线程执行一个任务,离不开Runnable与Callable这两个接口。 Runnable与Callable的区别在于,Runnable接口只有一个run方法,该方法用来执行逻辑,但是并没有返回值;而Ca

    2024年02月15日
    浏览(39)
  • 并发编程之五FutureTask

    futureTask实现了Runnable, Future接口,Future接口有如下定义: 示例:     示例1:取消,不通知任务线程中断 执行日志: 11:53:58.340 [pool-1-thread-1] DEBUG o.example.concurrent.FutureTaskTest - futureTask start 11:53:58.649 [pool-1-thread-1] DEBUG o.example.concurrent.FutureTaskTest - futureTask end 示例2:取消并通知任

    2023年04月15日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包