• 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

  • 相关阅读:
    卡片式电脑介绍
    怎样对ListView的项进行排序
    jsp 声明类的使用
    Linux下启用Chrome/Firefox的Java插件
    strcmp函数和strcpy函数
    Python+Django+SAE系列教程9-----Django的视图和URL
    美团面试,面一次,累一次
    关于 Head First SQL 中文版
    Linux 内核的编译系统
    简单的REST的框架实现
  • 原文地址:https://www.cnblogs.com/huzi007/p/7059528.html
Copyright © 2020-2023  润新知