根据前面我所说的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;那么就会阻塞该线程。直到资源获取然后该线程被唤醒。

最新文章

  1. ORA-12516:TNS:listener could not find available handler with matching protocol stack
  2. android之外部文件存储和读取
  3. svn 提交冲突(目录下删除文件)
  4. wordpress the_date 方法 偶尔为空的问题
  5. [HTML][服务器]状态码列表status
  6. Modoer列表页性能分析及优化
  7. lintcode:排颜色 II
  8. 【译】Optimize for mobile-移动端优化
  9. ASP.NET MVC 5 学习教程:添加模型
  10. IOS开发-表视图LV3导航控制器
  11. Actor-ES框架:Ray
  12. DB查询分析器访问EXCEL时,要在表名前后加上中括弧或双引号
  13. React笔记:组件(3)
  14. openssl 1.1.1 reference
  15. 多数据库有序GUID
  16. Spring系列(零) Spring Framework 文档中文翻译
  17. C++对象模型:成员变量<一>非静态成员变量
  18. Android-WebView与本地HTML (HTML调用-->Java的方法)
  19. 20155334 《网络攻防》 Exp6 信息搜集与漏洞扫描
  20. PHPCMS V9 全站通用日期时间标签

热门文章

  1. Ubuntu 16.04下使用Wine安装正则表达式工具RegexBuddy 4
  2. DBCC
  3. SilverLight:基础控件使用(5)-TreeView控件-基本使用
  4. asp.net Excel导入&导出
  5. C#制作、打包、签名、发布Activex全过程【转】
  6. C# PropertyGrid控件应用心得 【转】
  7. Android--------------几个ADB经常使用命令
  8. CUDA编程->CUDA入门了解(一)
  9. sonar+Jenkins代码覆盖率检测
  10. 搭建spark中需要注意的问题