zoukankan      html  css  js  c++  java
  • 并发模型(一)——Future模式

      多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future、Master-Worker、Guard Susperionsion、不变、生产者-消费者 模式;

    jdk除了定义了若干并发的数据结构,也内置了多线程框架和各种线程池;    锁(分为内部锁、重入锁、读写锁)、ThreadLocal、

    信号量等在并发控制中发挥着巨大的作用。这里重点介绍第一种并发——Future模型。

    一、什么是Future模型:

        该模型是将异步请求和代理模式联合的模型产物。类似商品订单模型。见下图:

    客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订单,不是商品本身),用户也无需等待,先去执行其他的若干操作后,再去调用服务器已经完成组装的真实数据。该模型充分利用了等待的时间片段。

     二、Future模式的核心结构:

    (1)Main函数:

    public class Main {  
          
        public static void main(String[] args){  
            Client client = new Client();  
            //理解返回一个FutureData  
            Data data = client.request("name");  
            System.out.println("请求完毕!");  
              
            try{  
                  
                //处理其他业务  
                //这个过程中,真是数据RealData组装完成,重复利用等待时间  
                Thread.sleep(2000);           
                  
            }catch (Exception e){  
                  
            }  
              
            //真实数据  
            System.out.println("数据 = "+ data.getResult());  
              
              
        }  
          
    }  

    Client的实现:

    public class Client {  
      
        public Data request(final String queryStr){  
            final FutureData future = new FutureData();  
            //开启一个新的线程来构造真实数据  
            new Thread(){  
                public void run(){  
                    RealData realData = new RealData(queryStr);  
                    future.setRealData(realData);           }  
            }.start();  
            return future;  
        }  
    }  

    Data的实现:

    public interface Data {  
      
        public  String getResult();  
    }  

    FutureData:

    /** 
     * 是对RealData的一个包装 
     * @author limin 
     * 
     */  
    public class FutureData implements Data {  
      
        protected RealData realData =null;  
        protected boolean isReady = false;  
        public synchronized void setRealData(RealData realData){  
            if(isReady){  
                return;  
            }  
            this.realData=realData;  
            isReady=true;  
            notifyAll();  
              
        }  
          
        @Override  
        public  synchronized  String getResult() {  
            while(!isReady){  
                try{  
                    wait();  
                }catch (Exception e){  
                      
                }  
            }  
            return realData.result;  
        }  
      
    }  

    RealData实现:

    public class RealData implements Data {  
        protected  String  result;  
          
        public RealData(String para){  
             //构造比较慢  
            StringBuffer sb= new StringBuffer();  
            for(int i=0;i<10;i++){  
                sb.append(para);  
                try{  
                    Thread.sleep(1000);  
                }catch(Exception e){  
                      
                }  
                result= sb.toString();  
            }  
        }  
          
          
          
        @Override  
        public String getResult() {  
      
            return result;  
        }  
      
    }  

    注意:

        FutureData是对RealData的包装,是dui真实数据的一个代理,封装了获取真实数据的等待过程。它们都实现了共同的接口,所以,针对客户端程序组是没有区别的;

        客户端在调用的方法中,单独启用一个线程来完成真实数据的组织,这对调用客户端的main函数式封闭的;

        因为咋FutureData中的notifyAll和wait函数,主程序会等待组装完成后再会继续主进程,也就是如果没有组装完成,main函数会一直等待。

  • 相关阅读:
    JDBC
    两道关于回溯法,分支限界法的算法题
    旅行售货员问题
    jdbc学习
    mysql简单练习
    取会邮件客户端中的密码
    触发器的使用
    事务的数据一致性测试
    读取其他软件listview控件的内容
    sqlserver2008 ,只能选C盘目录,不能选其它盘目录
  • 原文地址:https://www.cnblogs.com/duan2/p/7769109.html
Copyright © 2011-2022 走看看