博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Future模式
阅读量:6092 次
发布时间:2019-06-20

本文共 2549 字,大约阅读时间需要 8 分钟。

1 public interface Data {  2   3     String getRequest();  4 }  5   6   7 public class RealData implements Data{  8   9     private String result ; 10      11     public RealData (String queryStr){ 12         System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作.."); 13         try { 14             Thread.sleep(5000); 15         } catch (InterruptedException e) { 16             e.printStackTrace(); 17         } 18         System.out.println("操作完毕,获取结果"); 19         result = "查询结果"; 20     } 21      22 @Override 23     public String getRequest() { 24         return result; 25     } 26  27 } 28  29  30 public class FutureData implements Data{ 31  32     private RealData realData ; 33      34     private boolean isReady = false; 35      36     public synchronized void setRealData(RealData realData) { 37         //如果已经装载完毕了,就直接返回 38         if(isReady){ 39             return; 40         } 41         //如果没装载,进行装载真实对象 42         this.realData = realData; 43         isReady = true; 44         //进行通知 45         notify(); 46     } 47      48     @Override 49     public synchronized String getRequest() { 50         //如果没装载好 程序就一直处于阻塞状态 51         while(!isReady){ 52             try { 53                 wait(); 54             } catch (InterruptedException e) { 55                 e.printStackTrace(); 56             } 57         } 58         //装载好直接获取数据即可 59         return this.realData.getRequest(); 60     } 61  62  63 } 64  65  66 public class FutureClient { 67  68     public Data request(final String queryStr){ 69         //1 我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到,可以做其他的事情 70         final FutureData futureData = new FutureData(); 71         //2 启动一个新的线程,去加载真实的数据,传递给这个代理对象 72         new Thread(new Runnable() { 73             @Override 74             public void run() { 75                 //3 这个新的线程可以去慢慢的加载真实对象,然后传递给代理对象 76                 RealData realData = new RealData(queryStr); 77                 futureData.setRealData(realData); 78             } 79         }).start(); 80          81         return futureData; 82     } 83      84 } 85  86  87 public class Main { 88  89     public static void main(String[] args) throws InterruptedException { 90          91         FutureClient fc = new FutureClient(); 92         Data data = fc.request("请求参数"); 93         System.out.println("请求发送成功!"); 94         System.out.println("做其他的事情..."); 95          96         String result = data.getRequest(); 97         System.out.println(result); 98          99     }100 }

 

转载于:https://www.cnblogs.com/chensheng0617/p/8365225.html

你可能感兴趣的文章
Xtrabackup每周增量备份脚本程序
查看>>
在web工程中设置首页的页面
查看>>
Fail-Fast机制详解
查看>>
USACO1.5Superprime Rid[附带关于素数算法时间测试]
查看>>
Windows 10 开机项清理
查看>>
[转] 从 dll 程序集中动态加载窗体
查看>>
PM2实用入门指南
查看>>
HTML超链接
查看>>
python 技巧 之 pyCharm快速添加第三方库和插件
查看>>
jquery GET POST
查看>>
mysql 5.6.33发布
查看>>
个人总结
查看>>
Eclipse快捷键 10个最有用的快捷键
查看>>
Nexpose
查看>>
java 获取URL链接 内容
查看>>
Dynamo涉及的算法和协议——p2p架构,一致性hash容错+gossip协议获取集群状态+向量时钟同步数据...
查看>>
【高并发解决方案】2、集群概述
查看>>
opengl 矩阵变换
查看>>
Linux 命令详解(二)awk 命令
查看>>
Android动态载入Dex机制解析
查看>>