zoukankan      html  css  js  c++  java
  • Future模式的简单实现

    /**
     * 数据接口
     */
    public interface Data {
        public String getResult();
    }
    
    
    /**
     * 最终需要使用的数据模型
     */
    public class RealData implements Data{
        protected final String result;
        public RealData(String result) { //模型大的数据,构造比较慢用户等待很久
            StringBuffer sb = new StringBuffer();
            sb.append(result);
            for (int i = 0; i < 20; i++) {
                sb.append(i);
                sb.append(" ");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            this.result = sb.toString();
        }
    
        @Override
        public String getResult() {
            return result;
        }
    }
    
    
    /**
     * 真实数据的代理,封装真实数据的等待过程
     */
    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();//RealData已经被注入,通知getResult()
        }
        @Override
        public synchronized String getResult() { //等待RealData被注入
            while (!isReady){
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return realData.result;
        }
    }
    
    
    public class Client {
        public Data request(final String queryStr){
            final FutureData future = new FutureData();
            new Thread(){
                @Override
                public void run() { //RealData的构造很慢,所以在单独的线程中进行
                    RealData realData = new RealData(queryStr);
                    future.setRealData(realData);
                }
            }.start();
            return future; //立即返回
        }
    }
    
    /**
     * Future模式的简单实现
     * 参与者
     * Main:系统启动,调用Client发出请求
     * Client:返回Data对象,立即返回FutureData,并开启线程装配RealData
     * Data:返回数据的接口
     * FutureData:封装真实数据,需要装配RealData
     * RealData:真实数据
     */
    public class Main {
        public static void main(String[] args){
            Client client = new Client();
            Data data = client.request("name"); //立即返回的FutureData
            System.out.println("请求完毕");
            try {
                Thread.sleep(2000); //模拟其他业务,这段时间RealData被创建,充分利用时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("data:"+data.getResult());//真实数据
        }
        //请求完毕
        //data:name0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    }
    

    jdk自带

    • boolean cancel(boolean mayInterruptIfRunning) //取消任务
    • boolean isCancelled() //是否已经取消
    • boolean isDone() //是否已完成
    • V get() //取得返回对象
    • V get(long timeout, TimeUnit unit) //取得返回对象,可以设置超时时间
    
    import java.util.concurrent.Callable;
    /**
     * 使用JDK内置的Future
     */
    public class RealDataJDK implements Callable<String> {
        private String result;
        public RealDataJDK(String result) {
            this.result = result;
        }
        @Override
        public String call() throws Exception {
            //执行很慢的业务逻辑
            StringBuffer sb = new StringBuffer();
            sb.append(result);
            for (int i = 0; i < 10; i++) {
                sb.append(i);
                sb.append(" ");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return sb.toString();
        }
    }
    
    
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.FutureTask;
    
    public class MainJDK {
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            FutureTask<String> future= new FutureTask<>(new RealDataJDK("name"));
            ExecutorService executor = Executors.newFixedThreadPool(1);
            executor.submit(future);
            System.out.println("请求完毕");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //取得call()方法的返回值,如果此时call()方法没有执行完成,则依然会等待
            System.out.println("data:"+future.get());
            System.out.println("执行完成");
            executor.shutdown();
        }
    }
    
  • 相关阅读:
    实现主从关系Form中汇总行金额/数量
    Custom.pll : 客制化菜单
    XML publisher 填充空白行数
    PLSQL提交带有模板的报表的方法
    使用Form个性化修改标准Form的LOV2
    在开发Form表单中的三种查询方法
    S3C2440 I2C实现
    NBOOT 基于VS2005的编程与编译(一)
    WINCE 6.0 调大image config.bib
    少用的defined,注意不是define
  • 原文地址:https://www.cnblogs.com/fly-book/p/11435557.html
Copyright © 2011-2022 走看看