根据前面我所说的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模式的更多相关文章

  1. 多线程手写Future模式

    future模式 在进行耗时操作的时候,线程直接阻塞,我们需要优化这样的代码,让他再启动一个线程,不阻塞.可以执行下面的代码. 这个时候我们就用到了未来者模式 future设计类 只有一个方法 pub ...

  2. Callable的Future模式

    一.线程实现方式 1.继承Thread类 2.实现Runnable接口 3.线程池 4.Callable 二.无论使用继承Thread类还是实现Runnable接口,还是使用线程池都没有办法解决2个问 ...

  3. 代理模式精讲(手写JDK动态代理)

    代理模式是一种架构型模式,表现出来就是一个类代表另一个类的功能,一般用在想对访问一个类的时候做一些控制,同时又不想影响正常的业务,这种代理模式在现实的生活中应用的也非常的广泛,我用穷举法给举几个好理解 ...

  4. 手写node可读流之流动模式

    node的可读流基于事件 可读流之流动模式,这种流动模式会有一个"开关",每次当"开关"开启的时候,流动模式起作用,如果将这个"开关"设置成 ...

  5. 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...

  6. Java多线程之Executor框架和手写简易的线程池

    目录 Java多线程之一线程及其基本使用 Java多线程之二(Synchronized) Java多线程之三volatile与等待通知机制示例 线程池 什么是线程池 线程池一种线程使用模式,线程池会维 ...

  7. 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 手写文字识别   ...

  8. 手写一套迷你版HTTP服务器

    本文主要介绍如何通过netty来手写一套简单版的HTTP服务器,同时将关于netty的许多细小知识点进行了串联,用于巩固和提升对于netty框架的掌握程度. 服务器运行效果 服务器支持对静态文件css ...

  9. 线程笔记:Future模式

    线程技术可以让我们的程序同时做多件事情,线程的工作模式有很多,常见的一种模式就是处理网站的并发,今天我来说说线程另一种很常见的模式,这个模式和前端里的ajax类似:浏览器一个主线程执行javascri ...

随机推荐

  1. 左偏树 / 非旋转treap学习笔记

    背景 非旋转treap真的好久没有用过了... 左偏树由于之前学的时候没有写学习笔记, 学得也并不牢固. 所以打算写这么一篇学习笔记, 讲讲左偏树和非旋转treap. 左偏树 定义 左偏树(Lefti ...

  2. nginx 自签名https

    繁杂的命令,以下准备写好的sh,拷贝https.sh文件,设置执行权限:chmod u+x https.sh #!/bin/sh # create self-signed server certifi ...

  3. ios使用http来上传图片实现方法

    if (parameters) {                int genderNumber = 1;        self.token = loginToken;        self.p ...

  4. 这一篇里面有很多关于scala的list的操作的好的知识

    https://www.cnblogs.com/weilunhui/p/5658860.html 1.++[B]   在A元素后面追加B元素 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  5. qt实现又一次登录

    1.需求 须要实现程序操作过程中的又一次启动,即常常说的又一次登录功能 2.解决 在main函数中检測exec的返回值决定是关闭还是重新启动.使用注冊函数atexit(relogin)来实现这个功能 ...

  6. PHP_EOL是什么意思?

      PHP_EOL 代表php的换行符, 这个变量会根据平台而变, 在windows下会是/r/n, 在linux下是/n, 在mac下是/r             文章来源:刘俊涛的博客 地址:h ...

  7. APP公布到应用市场(苹果APP STORE+安卓各大应用市场)

    注意事项 1.应用要签名,为了以后可以顺利更新应用.要保持每次的签名一致,所以要妥善保管好签名数据. 2.进行公布測试,最好有个检查表,每次公布的时候进行核查. 苹果APP STORE 一.证书的导出 ...

  8. js 数组的迭代

    es5新增加的迭代方法(every,filter,forEach,map,some) arr1 = [1,2,3,4,5,6]; 1,every(); every() 方法使用指定函数检测数组中的所有 ...

  9. 【分布式计算】DFS && BigTable

    1.背景 分布式计算的发迹应该是google在2003年发表的三篇paper.各自是GFS.MapReduce.BigTable. 当中MapReduce大家都非常熟悉了.不懂的同学也能够看看我之前写 ...

  10. python(19)- 列表生成式和生成器表达式练习Ⅰ

    列表表达式 程序一: 常规写法: egg_list=[] for i in range(100): egg_list.append('egg%s' %i) print(egg_list) 列表表达式写 ...