博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java Future模式的使用
阅读量:5019 次
发布时间:2019-06-12

本文共 2372 字,大约阅读时间需要 7 分钟。

一、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;    }}

 

转载于:https://www.cnblogs.com/bingshu/p/9752366.html

你可能感兴趣的文章
收缩SqlServer数据库日记方法
查看>>
学习方法--提问
查看>>
merge-two-sorted-lists
查看>>
归并排序法
查看>>
CRC标准以及简记式
查看>>
SQL SERVER BOOK
查看>>
WebAPI HelpPage支持area
查看>>
Path元素
查看>>
js学习总结----DOM增删改和应用
查看>>
(20)sopel算法
查看>>
学习总结 javascript 闭包
查看>>
实验吧一个小坑注入
查看>>
【 D3.js 高级系列 — 8.0 】 打标
查看>>
Mac必备软件推荐
查看>>
Android Gson深入分析
查看>>
display:flow-root
查看>>
22-reverseString-Leetcode
查看>>
Centos 开机自动联网
查看>>
cocos2dx使用lua和protobuf
查看>>
Codeforces Round #327 (Div. 2)
查看>>