4.1.1 Future模式

来源:互联网 发布:手机定时器软件 编辑:程序博客网 时间:2024/06/05 15:01

核心思想

调用方式为异步,去除了主函数中的等待时间,主函数可去处理其他任务,如图:

代码实现

参与者 作用 Main 主函数,调用Client发出请求 Client 返回Data对象,立即返回FutureData,并开启ClientThread线程装配RealData Data 返回数据的接口 FutureData 虚拟数据,构造很快 RealData 真实数据,构造较慢



Future模式结构图


代码示意:

public static void main(String[] args){     Client client = new Client();     //立即返回,得到FutureData     Data data=client.request("name");     System.out.println("请求完毕");     //用sleep代表执行其他业务逻辑     Thread.sleep(2000);     //使用真实数据RealData     System.out.println(data.getResult());}//Data接口public interface Data{     public String getResult();}//Client类public class Client{     public Data request(String str)     {          FutureData fd = new FutureData();          //RealData构造很慢,单独开线程构造          new Thread()          {               public void run()               {                    RealData rd = new RealData(str);                    fd.setRealData(rd);               }          }.start();          return fd;     }}//FutureData类public class FutureData implements Data{     //FutureData是对RealData的包装     protected RealData rd = null;     protected boolean isReady=false;     public synchronized void setRealData(RealData rd)     {          if(isReady)          {               return;          }          this.rd=rd;          isReady=true;          notifyAll();     }     //会等待RealData构造完成     public synchronized String getResult()     {          while(!isReady)          {               //此类中可能有其他多线程任务,被唤醒的原因不一定是RealData构造完成,所以需要循环判断isReady是否真的构造完成               wait();          }          return rd.getResult();     }}//RealData类public class RealData implements Data{     private String result=null;     public RealData()     {          //构造数据,假设很慢          result = new String("xxxxxx");     }     public String getResult()     {          return result;     }}

JDK内置实现

JDK内置实现

想要异步执行的业务逻辑放在call()方法内

代码示意:

public class RealData implements Callable<String>{     private String para;     public RealData(String para)     {          this.para=para;     }     //真实业务逻辑     @Override     public String call()     {          //构造数据,假设很慢          return new String("xxxx");     }}public class Main{     public static void main(String[] args)     {          FutureTask<String> future = new FutureTask<String>(new RealData("a"));          ExecutorService exe = Executors.newFixedThreadPool(1);          //开启线程执行RealData的call()方法,相当于2中的client.request()          exe.submit(future);          System.out.println("请求完毕");          //用sleep代表执行其他业务逻辑          Thread.sleep(5000);          //使用真实数据,相当于2中的data.getResult(),如果call()没有执行完,依然会等待          System.out.println(future.get());     }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 螺丝拧木头不紧怎么办 六方螺母滑了怎么办 螺母滑丝怎么拧下来怎么办 安装车牌螺丝眼滑丝了怎么办 注塑机孔螺丝洞滑丝了怎么办 空调内机螺丝洞滑丝了怎么办 小螺丝钉滑牙了怎么办? 螺丝滑扣了怎么办 松 苹果8p螺丝滑了怎么办 座椅孔螺丝滑了怎么办 车轮胎螺丝突扣了怎么办 孔里面滑丝了怎么办 六口螺丝滑扣了怎么办 手机螺丝滑扣了怎么办 超极本没有网线接口怎么办 机动车禁令标识位置放置错误怎么办 六角头冲得不标准怎么办 滚丝杆烫手怎么办怎样能不烫手 带滚花的杆子里面脏怎么办 田螺和玉米吃了怎么办 lv包包螺丝掉了怎么办 螺狮那一段吃了怎么办 吃了不熟的田螺怎么办 包上的螺丝掉了怎么办 工厂打螺丝手疼怎么办 打螺丝打到手痛怎么办 欧曼gtl不烧尿素怎么办 放油螺丝滑牙怎么办 蝴蝶刀螺丝松了怎么办 婴儿车铆钉松了怎么办 扇子上的铆钉松怎么办 锅的把手松了怎么办 奶锅把手松了怎么办 锅的手柄烧坏了怎么办 鞋子上的铆钉生锈了怎么办 包包上的铆钉生锈了怎么办 凉鞋的铆钉生锈了怎么办 扇子的铆钉坏了怎么办 包包的铆钉坏了怎么办 汽车半轴螺丝母拧不动怎么办? 卫衣袖子短了怎么办