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

news/2024/11/17 0:27:53/

目录

  • 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;@Overridepublic 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>() {@Overridepublic 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方法,如果数据已经加载,那么会返回这些数据,否则将等待加载完成后再返回。


http://www.ppmy.cn/news/238786.html

相关文章

OpenStack介绍

OpenStack 1. OpenStack1.1 简介1.2 OpenStack和KVM有什么关系和区别&#xff1f;1.3 编写语言 2. 主要模块介绍2.1 OpenStack计算设施 - Nova1. API服务器&#xff08;nova-api&#xff09;2. 消息队列&#xff08;Rabbit MQ Server&#xff09;3. 运算工作站&#xff08;nova…

软考A计划-电子商务设计师-模拟试题卷四

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

【报告分享】衣物护理生活小电器—消毒、干衣需求创新报告-TMIC消费者洞察(附下载)

摘要:报告显示&#xff0c;手持挂烫机的消费群体普遍中高收入&#xff0c;对品类价格敏感度低&#xff1b;生活方式上追求得体打扮、精神有型、细节和品质护衣。其中&#xff0c;女性消费者占比达到85.93%&#xff0c;一二线城市消费占比过半。“追潮追新、敢尝试、买颜值、买科…

VR多人协同联网拆装演示(1)

https://www.bilibili.com/video/BV1ZY4y1a743?share_sourcecopy_webhttps://www.bilibili.com/video/BV1ZY4y1a743?share_sourcecopy_web演示的是多人协同里面的单人操作&#xff0c;拆除&#xff0c;搬运&#xff0c;换手等&#xff0c;当然可以多人&#xff0c;下一篇放多…

小学生学习编程1年,发明自动烫毛肚机和卡路里计算器?

四川人爱吃火锅估计全国人民都知道了&#xff0c;这不是什么稀罕事&#xff0c;吃火锅自然少不了毛肚&#xff0c;烫毛肚的时间是决定毛肚口感的关键&#xff0c;成都一位4年级的小学生学习编程才一年&#xff0c;居然自己发明了自动烫毛肚机。 这下可真的是彻底解放双手了&…

常用的电子产品安规基础标准 - IEC Standards(CB转换或各国安规标准)

常用的电子产品安规基础标准 - IEC Standards&#xff08;CB转换或各国安规标准&#xff09; 电子产品的安全以及造成的重大危害大家众所周知&#xff0c; 因此安规设计及认证成为产品定型及投入市场的必经之路&#xff0c; 各国为此制定相应的安规标准如中国CCC, 美国UL或ETL…

ecshop 数据库调试技巧 【强烈推荐】

ecshop 数据库调试技巧 【强烈推荐】 因为ecshop 吧数据库操作都方式在日志数组中了 print_r($_GLOBALS); 就可以看到全貌 Array ([GLOBALS] > Array*RECURSION*[_POST] > Array()[_GET] > Array([id] > 167)[_COOKIE] > Array([ECS_ID] > 31572d0ff8f211fb…

电商产品安全要求(UL+IEC)

电商产品安全要求(ULIEC) 线上&#xff08;online&#xff09;销售产品越来普遍&#xff0c;甚至比重越来越高&#xff0c; 这也是消费者接受、认可甚至欢迎的消费模式&#xff0c;为此相应的配套监管就必须出来。 国家于2018年8月31号正式通过中华人民共和国电商法并于2019年…