zoukankan      html  css  js  c++  java
  • java 多线程 Callable中的futrue模式

    java实现Callable接口中用到了future模式,所以实现了这个接口就看到了有返回值,那它的基本原理是什么鬼,往下看。

    何为future模式?

    future模式有点类似于商品订单。在网上购物时,提交订单后,在收货的这段时间里无需一直在家里等候,可以先干别的事情。类推到程序设计中时, 当提交请求时,期望得到答复时,如果这个答复可能很慢。传统的时一直等待到这个答复收到时再去做别的事情,但如果利用Future设计模式就无需等待答复 的到来,在等待答复的过程中可以干其他事情。

    应用场景:线程A需要线程B的执行结果,但没必要一直等待线程B执行完,这个时候可以先拿到未来的Future对象,等线程B执行完再来取真实结果。就是先让你看到,等一会儿用而已。

    java模拟代码实现如下:

    package com.ming.thread.one.future;
    
    //先封装一个data 接口
    public interface Data {
    
         String getResult() throws InterruptedException;
    }
    package com.ming.thread.one.future;
    
    public class RealData implements Data {
        
        protected String data;
     
        public RealData(String data) {
            this.data = data;
        }
     
        @Override
        public String getResult() {
            return data;
        }
    }
    package com.ming.thread.one.future;
    
    
    //FutureData是Future模式的关键,它实际上是真实数据RealData的代理,封装了获取RealData的等待过程
    public class FutureData implements Data {
        
        RealData realData = null; //FutureData是RealData的封装
        boolean isReady = false;  //是否已经准备好
         
        public synchronized void setRealData(RealData realData) {
            if(isReady)
                return;
            this.realData = realData;
            isReady = true;
            notifyAll(); //RealData已经被注入到FutureData中了,通知getResult()方法
        }
     
        @Override
        public synchronized String getResult() throws InterruptedException {
            if(!isReady) {
                wait(); //一直等到RealData注入到FutureData中
            }
            return realData.getResult(); 
        }
    }
    package com.ming.thread.one.future;
    
    public class Client {
    
        public Data request(final String string) {
            final FutureData futureData = new FutureData();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // RealData的构建很慢,所以放在单独的线程中运行
                    RealData realData = new RealData(string);
                    futureData.setRealData(realData);
                    System.out.println("异步给realData设置值哦");
                }
            }).start();
            System.out.println("优先返回futureData对象");
            return futureData; // 先直接返回FutureData
        }
    }
    package com.ming.thread.one.future;
    
    public class Test {
    
        public static void main(String[] args) throws InterruptedException {
            Client client = new Client();
            //这里会立即返回,因为获取的是FutureData,而非RealData
            Data data = client.request("name");
            //这里可以用一个sleep代替对其他业务逻辑的处理
            //在处理这些业务逻辑过程中,RealData也正在创建,从而充分了利用等待时间
            Thread.sleep(2000);
            //使用真实数据
            System.out.println("数据="+data.getResult());
        }
    }

    不明觉厉..

    转:http://www.cnblogs.com/winkey4986/p/6203225.html

  • 相关阅读:
    PAT (Advanced Level) Practice 1071 Speech Patterns (25分)
    PAT (Advanced Level) Practice 1070 Mooncake (25分)
    PAT (Advanced Level) Practice 1069 The Black Hole of Numbers (20分)
    PAT (Advanced Level) Practice 1074 Reversing Linked List (25分)
    PAT (Advanced Level) Practice 1073 Scientific Notation (20分)
    第一次冲刺个人总结01
    构建之法阅读笔记01
    人月神话阅读笔记01
    四则运算2
    学习进度条(软件工程概论1-8周)
  • 原文地址:https://www.cnblogs.com/huzi007/p/7059528.html
Copyright © 2011-2022 走看看