Java JUC工具类--Future

  • Future模式,也是非常经典的设计模式,这种模式主要就利用空间换时间的概念,也就是说异步执行(需要开启一个新的线程)
  • 在互联网高并发的应用服务中,我们随处可见这种理念和代码,主要就是使用了这种模式
  •  Future模式非常适合在处理耗时很长的业务逻辑时进行使用,可以有效的减小系统的响应时间,提高系统的吞吐量
package com.example.core.juc;import java.util.concurrent.*;public class UseFuture implements Callable<String> {private String param;public UseFuture(String param){this.param = param;}@Overridepublic String call() throws Exception{//模拟执行业务的耗时Thread.sleep(3000);String result = this.param =",处理完成";return result;}public static void main(String[] args) throws InterruptedException, ExecutionException {String queryStr1 = "query1";String queryStr2 = "query2";FutureTask<String> future1 = new FutureTask<String>(new UseFuture(queryStr1));FutureTask<String> future2 = new FutureTask<String>(new UseFuture(queryStr2));ExecutorService executorService = Executors.newFixedThreadPool(2);executorService.submit(future1);//异步的操作executorService.submit(future2);//异步的操作System.out.println("处理其他的任务");Thread.sleep(2000);String ret1 = future1.get();String ret2 = future2.get();System.out.println("数据处理完成"+ret1);System.out.println("数据处理完成"+ret2);
/*
output:
处理其他的任务
数据处理完成,处理完成
数据处理完成,处理完成*/}
}

future设计模式

  • 最为关键的就是FutureData包装类,当客户端发出请求,FutureData会接收并返回请求,但是此时这个call return并不包含真是的数据,FutureData会发送other call去获取真实的数据类,再将真实的数据类返回,用于真正的实际使用。

  • Future模式有点类似于商品订单。 比如在网购时,当看重某一件商品事,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可
  •  或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其他内容

例子

  • 网购时,当看重某一件商品事,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可
  • 当客户端发起请求,返回包装类对象,另外起一个线程去查询数据,再将真实的数据返回

  • Main.java
package com.example.core.future;public class Main {public static void main(String[] args) {FutureClient fc = new FutureClient();Data data = fc.request("请求参数");//异步执行System.out.println("做其他的相关业务操作");String rst = data.getRequest();//这才是真正的获取实际数据的方法System.out.println("---"+rst);}
}
/*
做其他的相关业务操作
根据查询参数:请求参数进行查询数据库操作这可能需要5秒左右的时间
---100条数据*/
  • Data抽象层 
package com.example.core.future;public interface Data {String getRequest();
}
  • FutureClient.java
package com.example.core.future;public class FutureClient {public Data request(final String queryStr){FutureData futureData = new FutureData();//异步的起一个线程去进行相应的处理操作new Thread(new Runnable() {@Overridepublic void run() {//需要把请求的参数 设置到真实数据的处理对象中去RealData realData = new RealData(queryStr);//真实请求处理完成之后,我们需要进行设置,将结果给包装对象futureData.setRealData(realData);}}).start();;return futureData;}
}
  • FutureData.java
package com.example.core.future;public class FutureData implements Data{//真实数据对象的引用private RealData realData;//实际处理的状态private boolean isReady = false;public synchronized void setRealData(RealData realData){if (isReady){return ;}//如果是真实的对象赋值成功,那么就认为数据已经准备好了this.realData = realData;isReady = true;//真实的数据已经准备好了,我们进行唤醒操作notify();}@Overridepublic synchronized  String getRequest() {while(!isReady){try{wait();}catch (InterruptedException e){e.printStackTrace();}}return this.realData.getRequest();}
}
  • RealData.java
package com.example.core.future;public class RealData implements Data{private String result;public RealData(String queryStr){System.out.println("根据查询参数:"+queryStr+"进行查询数据库操作这可能需要5秒左右的时间");try{//时间的查询耗时Thread.sleep(5000);}catch (InterruptedException e){e.printStackTrace();}result = "100条数据";}@Overridepublic String getRequest() {return result;}
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java JUC工具类--ForkJoin

ForkJoin Fork/Join框架是JAVA7提供的一个用于并行执行任务的框架&#xff0c;是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架Fork/Join中两个重要的类 ForkJoinTask&#xff1a;使用该框架&#xff0c;需要创建一个ForkJoin任务…

修复bug的12个关键步骤

要多少时间才能修复bug&#xff0c;事先是很难知道的&#xff0c;特别是如果你和这些代码还素不相识的话&#xff0c;情况就更加扑朔迷离了。James Shore在《The Art of Agile 》一书中&#xff0c;明确指出要想修复问题得先知道问题的所在。而我们之所以无法准确估计时间是因为…

Java JUC工具类--Master-Worker

Master-Worker Master-Worker模式是常用的并行计算模式。它的核心思想是系统由两类进程协作工作&#xff1a;Master进程和Worker进程Master负责接收和分配任务&#xff0c;Worker负责处理子任务当各个Worker子进程处理完成后&#xff0c;会将结果返回给Master&#xff0c;由Ma…

python 基础知识点整理 和具体应用

Python教程 Python是一种简单易学&#xff0c;功能强大的编程语言。它包括了高效的高级数据结构和简单而有效的方法&#xff0c;面向对象编程。Python优雅的语法&#xff0c;动态类型&#xff0c;以及它天然的解释能力&#xff0c;使其成为理想的语言&#xff0c;脚本和应用程序…

使用postman模拟百度通用文字识别

1&#xff0c;登录百度AI开放平台 百度AI网站新手指南链接在顶部导航栏中&#xff0c;找到控制台选项&#xff0c;输入账号和密码&#xff0c;进入管理中心页面在管理中心页面中&#xff0c;找到文字识别的选项找到创建应用的选项&#xff0c;进行ocr项目的创建需要输入应用的…

Java调用百度OCR文字识别的接口

调用百度OCR文字识别的接口&#xff0c;来自于百度官网&#xff0c;亲测可以使用 跳转链接FileUtil的下载链接Base64Util下载链接HttpUtil下载链接GsonUtils下载链接Accurate.java文件 package com.baidu.ai.aip;import com.baidu.ai.aip.utils.Base64Util; import com.baidu.…

Redis Cluster集群模式

Redis Cluster 它是Redis的分布式解决方案&#xff0c;在Redis 3.0版本正式推出的&#xff0c;有效解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时&#xff0c;可以采用Cluster架构达到负载均衡的目的。数据分布理论: 分布式数据库首要解决把整个数据集按照…

Redis整合Springboot实现数据共享

代码的整体结构 RedisSessionConfig.java package com.cc.springbootredissession.config;import org.springframework.context.annotation.Configuration; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;Configuration E…

Redis整合Springboot实现单机配置

整体结构 配置文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/…

Redis整合springboot实现哨兵模式

整体结构 RedisConfig package com.cc.springredis.config;import com.cc.springredis.RedisUtil; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.R…

Redis整合springboot实现集群模式

整体结构 Redis.config package com.cc.springredis.config;import com.cc.springredis.RedisUtil; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection…

Redis整合springboot实现消息队列

publisher消息的发出 代码整体的结构 publisherConfig package com.cc.springbootredispublisher.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.conne…

Redis数据缓存

代码的整体结构 配置文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apac…

hevc/265 开源项目及相关

1.X265 个是有两个版本&#xff0c;一个是国内人搞的&#xff0c;是国外公司搞的 1.国外公司版本 只是一个编码器&#xff0c;目前没有支持解码 开发语言 c web url: www.x265.org source url: https://bitbucket.org/multicoreware/x265 x265 is an open-source projec…

IPFS星际文件系统的简介

IPFS简介 IPFS&#xff08;InterPlanetary File System&#xff09;叫星际文件传输系统&#xff0c;本质是一个基于点对点的分布式超媒体分发协议&#xff0c;它整合了分布式系统&#xff0c;为所有人提供全球统一的可寻址空间&#xff0c;因为他具有良好的安全性、较高的传输…

ARM和NEON指令 very nice

在移动平台上进行一些复杂算法的开发&#xff0c;一般需要用到指令集来进行加速。目前在移动上使用最多的是ARM芯片。 ARM是微处理器行业的一家知名企业&#xff0c;其芯片结构有&#xff1a;armv5、armv6、armv7和armv8系列。芯片类型有&#xff1a;arm7、arm9、arm11、corte…

IPFS下载安装和配置

参考链接 因为这个网站访问速度很慢&#xff0c;我提供了IPFS的MAC版本。有需要的查看我的资源下载。 大致流程 安装 $ ls go-ipfs_v0.4.10_darwin-amd64.tar.gz $ tar xvfz go-ipfs_v0.4.10_darwin-amd64.tar.gz x go-ipfs/build-log x go-ipfs/install.sh x go-ipfs/ipfs…

arm 开发工具比较(ADS vs RealviewMDK vs RVDS)

ADS REALVIEW MDK RVDS 公司 ARM Keil&#xff08;后被ARM收购&#xff09; ARM 版本 最新1.2 ,被RVDS取代 最新4.0 是否免费 破解情况 有 有 工程管理 CodeWarrior IDE nVision IDE Eclipse/ CodeWarrior IDE 编译器 ARM C compiler for AD…

解决macOS Catalina(10.15)解决阻止程序运行“macOS无法验证此App不包含恶意软件”

在终端里面输入如下命令 sudo spctl --master-disable 下面图片对比执行命令前后&#xff0c;安全性与隐私 界面上显示的差异&#xff1a;使用命令之后&#xff0c;界面变了

MAC版 的最新Docker 2.2版本配置国内代理的解决办法

点击Docker图标&#xff0c;选择Preference选项&#xff0c;进行国内代理的问题 输入内容如下 {"experimental": false,"debug": true,"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.…