zoukankan      html  css  js  c++  java
  • java Future模式的使用

    一、Future模式的使用。

    Future模式简述

           传统单线程环境下,调用函数是同步的,必须等待程序返回结果后,才可进行其他处理。 Futrue模式下,调用方式改为异步。

    Futrue模式的核心在于:充分利用主函数中的等待时间,利用等待时间处理其他任务,充分利用计算机资源。

    主要角色

    Main:系统启动,调用Client发出请求

    Client:返回Data对象,立即返回FutureData,并开启ClientThread线程装配

    RealData Data:返回数据的接口

    FutureData:Futrue数据,是一个虚拟的数据,需要装配RealData RealData:真实数据,构造比较慢

    二、实现代码

     Main类

    public class Main {
        public static void main(String[] args) {
            FutureClient fc = new FutureClient();
            Data data = fc.request("请求参数");
            System.out.println("请求参数发送成功");
            System.out.println("开始做其他事情");
            String result = data.getRequest();
            System.out.println(result);
        }
    }

    FutureCliet类

       

    public Data request(final String queryStr) {
            // 1 我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端,
            // 告诉他的请求已经收到,可以干其他事情
            final FutureData futureData = new FutureData();
    
            // 2.创建一个新的线程,去加载真是数据,传递个这个代理对象
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // 3.这个新的线程可以慢慢去加载真是对象,然后传递给代理对象
                    RealData realData = new RealData(queryStr);
                    futureData.setRealData(realData);
                }
            }).start();
    
            return futureData;
        }

    Data接口

        

    public interface Data {
        String getRequest();
    }

    FutureData

    public class FutureData implements Data {
    
        private RealData realData;
    
        private boolean isReady = false;
    
        @Override
        public synchronized String getRequest() {
    
            // 如果没有装载好久一直处于阻塞状态
            while (!isReady) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 装载好可以直接获取数据
            return this.realData.getRequest();
        }
    
        public synchronized void setRealData(RealData realData) {
            if (isReady) {
                return;
            }
            this.realData = realData;
            isReady = true;
            notify();
        }
    
    }

    RealData

     

    public class RealData implements Data {
    
        private String result;
    
        public RealData() {
        }
    
        public RealData(String queryStr) {
            System.out.println("根据" + queryStr + "进行查询" + "这是一个很耗时间的操作...");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("操作完毕");
            result = "查询结果";
        }
    
        @Override
        public String getRequest() {
            return result;
        }
    
    }
  • 相关阅读:
    java模式及其应用场景
    redis配置密码 redis常用命令
    Redis可视化工具Redis Desktop Manager使用
    String类和StringBuffer类的区别
    centos下搭建redis集群
    eclipse maven项目中使用tomcat插件部署项目
    什么是反向代理,如何区别反向与正向代理
    数据库连接池的原理
    归并排序
    asio-kcp源码分析
  • 原文地址:https://www.cnblogs.com/bingshu/p/9752366.html
Copyright © 2011-2022 走看看