手写Future模式
根据前面我所说的Futrue模式,手写一个:
分别对应的Java代码,大家拿来参考:
package FutureTest; //公共data数据接口
public abstract class Data {
//方法作用 返回线程执行结果
public abstract String getRequest();
}
package FutureTest;
//获取真实数据
public class RealData extends Data { private String requestData;
public RealData(String requestData){
System.out.println("正在使用data进行网络请求,data"+requestData+"开始");
try {
//模拟执行业务逻辑耗时时间
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("操作执行完毕...获取结果");
//获取返回结果
this.requestData="结果";
}
@Override
public String getRequest() { return requestData;
} }
package FutureTest; //当有线程想要获取RealData时候,程序会被阻塞。等到RealData被注入才会使用getReal()方法
public class FutureData extends Data{ private boolean FLAG = false;
private RealData realData;
//读取data数据
public synchronized void setRealData(RealData realData){
//读取结果
if (FLAG) { //true 说明已经获取到结果了 如果获取到则直接返回结果 }
//如果flag是false,没有获取到数据,传递realData对象
this.realData=realData;
FLAG=true; //获取到执行结果 改为true
notify();//唤醒
} @Override
public synchronized String getRequest() {
while (!FLAG) { //如果false 一直等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return realData.getRequest();
} }
package FutureTest; public class FutureClient {
//用户请求时候就会调用这个方法
public Data request(String requestData){
FutureData futureData = new FutureData();
//开启一个线程
new Thread(new Runnable() {
public void run() {
//会有阻塞 但是不影响到主线程
RealData realData= new RealData("toov5"); //执行业务逻辑 然后返回结果
futureData.setRealData(realData); //把加载到的值(返回结果)设置给他 }
}).start(); return futureData;
} }
启动类主函数:
package FutureTest; public class Main {
public static void main(String[] args) {
FutureClient futureClient = new FutureClient();
Data request = futureClient.request("cone on");
System.out.println("数据发送成功"); //主线程
System.out.println("主线程继续干自己的");
String result = request.getRequest();
System.out.println("主线程去获取结果"+result);
}
}
结果:
大家对应着上一篇博客好好研究下,这个模式的应用场景还是蛮多的。代码挺有趣的。
当要获取资源的时候,data.getResult() ,如果资源没有准备好false;那么就会阻塞该线程。直到资源获取然后该线程被唤醒。
手写Future模式的更多相关文章
- 多线程手写Future模式
future模式 在进行耗时操作的时候,线程直接阻塞,我们需要优化这样的代码,让他再启动一个线程,不阻塞.可以执行下面的代码. 这个时候我们就用到了未来者模式 future设计类 只有一个方法 pub ...
- Callable的Future模式
一.线程实现方式 1.继承Thread类 2.实现Runnable接口 3.线程池 4.Callable 二.无论使用继承Thread类还是实现Runnable接口,还是使用线程池都没有办法解决2个问 ...
- 代理模式精讲(手写JDK动态代理)
代理模式是一种架构型模式,表现出来就是一个类代表另一个类的功能,一般用在想对访问一个类的时候做一些控制,同时又不想影响正常的业务,这种代理模式在现实的生活中应用的也非常的广泛,我用穷举法给举几个好理解 ...
- 手写node可读流之流动模式
node的可读流基于事件 可读流之流动模式,这种流动模式会有一个"开关",每次当"开关"开启的时候,流动模式起作用,如果将这个"开关"设置成 ...
- 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...
- Java多线程之Executor框架和手写简易的线程池
目录 Java多线程之一线程及其基本使用 Java多线程之二(Synchronized) Java多线程之三volatile与等待通知机制示例 线程池 什么是线程池 线程池一种线程使用模式,线程池会维 ...
- Atitit s2018.2 s2 doc list on home ntpc.docx \Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别 讯飞科大 语音云.docx \Atitit 代码托管与虚拟主机.docx \Atitit 企业文化 每日心灵 鸡汤 值班 发布.docx \Atitit 几大研发体系对比 Stage-Gat
Atitit s2018.2 s2 doc list on home ntpc.docx \Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别 ...
- 手写一套迷你版HTTP服务器
本文主要介绍如何通过netty来手写一套简单版的HTTP服务器,同时将关于netty的许多细小知识点进行了串联,用于巩固和提升对于netty框架的掌握程度. 服务器运行效果 服务器支持对静态文件css ...
- 线程笔记:Future模式
线程技术可以让我们的程序同时做多件事情,线程的工作模式有很多,常见的一种模式就是处理网站的并发,今天我来说说线程另一种很常见的模式,这个模式和前端里的ajax类似:浏览器一个主线程执行javascri ...
随机推荐
- Wireshark如何选择多行
Wireshark如何选择多行 在Wireshark中,用户经常需要选择几行,然后进行批量操作,如导出或者分析.但Wireshark没有提供通过鼠标直接选择多行的功能.这个时候,用户需要采用标记分 ...
- CentOS6.7安装部署LNMP(nginx1.8.0+php5.6.10+mysql5.6.12)
IP-10.0.0.8 1.安装nginx mkdir -p /server/tools cd /server/tools yum install -y pcre pcre-devel openssl ...
- HDU 4081 Qin Shi Huang's National Road System 最小生成树+倍增求LCA
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4081 Qin Shi Huang's National Road System Time Limit: ...
- SpringMVC整合MongoDB
首先,在pom文件中新增spring-data-mongodb的依赖: <dependency> <groupId>org.springframework.data</g ...
- openfire Android学习(一)----实现用户注册、登录、修改密码和注销等
以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...
- squirrelsql安装
官网下载安装,第一次安装mac上,失败,后续重启mac看下.重启完后,还是起不来,估计和某些环境冲突,或者缺少环境 使用squirrelsql如何连接hive? http://lxw1234.com/ ...
- 高通msm8994启动流程简单介绍
处理器信息 8994包括例如以下子系统: 子系统 处理器 含义 APSS 4*Cortex-A53 应用子系统 APSS 4*Cortex-A57 应用子系统 LPASS QDSP6 v5.5A(He ...
- python 使用cx-freeze打包程序
python环境 3.6.5 win7 linux环境同理 先尝试了PyInstaller ,打包时一直提示 no module named gtk 而gtk 又依赖pygobj ...
- Data Binding Guide——google官方文档翻译(上)
android引入MVVM框架时间还不长,眼下还非常少有应用到app中的.但它是比較新的技术,使用它来搭建项目能省非常多代码,并且能使用代码架构比較清晰.本篇文章是我在学习MVVM时翻译的.篇幅比較长 ...
- POJ 3978(求素数)
知识点: 1.求素数的test,从2~sqrt(n): 2.假设数据非常多,能够用素数表记录,然后sum=prime[m]-prime[n]求得! ! !! !!! !! ...