文档章节

多线程模式(1):Future模式

小七酱
 小七酱
发布于 2015/07/23 16:24
字数 579
阅读 13
收藏 0

小白学习看看!记录过程

1. 创建数据处理接口

package com.xqi.f;

/**
 * 数据返回接口
 * 
 * @author mike <br>
 *         2015年7月23日
 */
public interface Data {

    /**
     * 返回的数据
     * 
     * @return
     */
    Object getResult();

}

2. 创建真实数据返回

package com.xqi.f;

/**
 * 真实数据返回
 * 
 * @author mike <br>
 *         2015年7月23日
 */
public class RealData implements Data {

    protected final String result;

    public RealData(String para) {
        try {
            Thread.sleep(100);// 模拟业务处理耗时
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        result = para;
    }

    public synchronized Object getResult() {
        return result;
    }

}

3. 创建Future数据代理,主要是对于真实数据进行包装操作

package com.xqi.f;

/**
 * 
 * 用于返回真实数据的代理
 * 
 * @author mike <br>
 *         2015年7月23日
 */
public class FutureData implements Data {

    // 真实数据返回
    protected RealData realData;

    // 是否可读
    protected boolean isReady = false;

    /**
     * 注入真实数据
     * 
     * @param realData
     */
    public synchronized void setRealData(RealData realData) {
        if (isReady)
            return;
        this.realData = realData;
        this.isReady = true;// 当有数据注入的时候,设置为可读
        notifyAll();// 数据注入了以后,我们要通知这个对象线程可以开始读取了
    }

    /**
     * 用户返回处理完成的数据
     */
    public synchronized Object getResult() {
        while (!isReady) {// 当不可读的时候
            try {
                wait();// 设置为对象线程等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return realData.getResult();
    }

}

4. 创建模拟请求的客户端

package com.xqi.f;

/**
 * 客户端的实现
 * 
 * @author mike <br>
 *         2015年7月23日
 */
public class Client {

    /**
     * 用于发送一个处理数据的请求并返回结果
     * 
     * @param queryStr
     * @return
     */
    public Data reqeust(final String queryStr) {
        
        final FutureData future = new FutureData();

        new Thread() {
            @Override
            public void run() {
                RealData realData = new RealData(queryStr);
                future.setRealData(realData);
            }
        }.start();
        return future;
    }

}

5. 测试Test

package com.xqi.f;

/**
 * 测试的main
 * 
 * @author mike <br>
 *         2015年7月23日
 */
public class FTest {

    public static void main(String[] args) {
        Client client = new Client();
        Data data = client.reqeust("name"); //这里可以很快的返回结果,因为返回的是FutureData 
        System.out.println("请求完毕!");

        try {
            Thread.sleep(2000);// 模拟业务操作耗时
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("真实数据:" + data.getResult());

    }

}


PS: 确实以前对于多线程的环节了解比较少!在业务比较少的情况下,还是看起来压力,但是负责,光是看图,了解流程,已经很是无奈的摇头了!







© 著作权归作者所有

共有 人打赏支持
小七酱
粉丝 1
博文 30
码字总数 17079
作品 0
武汉
程序员
私信 提问
并发编程-Future模式

1.Future模式有点类似商品订单。比如在网上进行购物,当看中某一件商品时,就可以提交订单。提交订单完毕在家等候送货上门。卖家根据订单取货、发货,并配送到顾客手中。大部分情况下,卖家处...

cosco
2016/05/02
123
1
[高并发Java 七] 并发设计模式

什么是设计模式 在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题 ,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建...

Hosee
2016/02/14
6.7K
0
Java多线程 - Future模式

什么是Future模式 Future模式是多线程开发中非常常见的一种设计模式。它的核心思想是异步调用。当我们需要调用一个函数方法时。如果这个函数执行很慢,那么我们就要进行等待。但有时候,我们可...

嘉伟咯
2017/09/09
0
0
Java多线程--并行模式与算法

Java多线程--并行模式与算法 单例模式 虽然单例模式和并行没有直接关系,但是我们经常会在多线程中使用到单例。单例的好处有: 对于频繁使用的对象可以省去new操作花费的时间; new操作的减少...

sunhaiyu
2018/05/18
0
0
Java8新的异步编程方式 CompletableFuture(一)

一. Future JDK 5引入了Future模式。Future接口是Java多线程Future模式的实现,在java.util.concurrent包中,可以来进行异步计算。 Future模式是多线程设计常用的一种设计模式。Future模式可...

Tony沈哲
2017/10/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

/sbin/ldconfig.real: /usr/local/lib/libcudnn.so.7 不是符号链接

平台:Ubuntu 18 LTS 问题描述 /sbin/ldconfig.real: /usr/local/lib/libcudnn.so.7 不是符号链接 解决办法:建立软连接 sudo ln -sf /usr/local/lib/libcudnn.so.7.1.3 /usr/local/lib/libc......

Pulsar-V
13分钟前
0
0
C++多线程之使用Mutex和Critical_Section

Mutex和Critical Section都是主要用于限制多线程(Multithread)对全局或共享的变量、对象或内存空间的访问。下面是其主要的异同点(不同的地方用绿色表示)。 Mutex Critical Section 性能和...

shzwork
27分钟前
0
0
AWS的自动部署工具codedeploy 部署前的准备工作

开始部署codedeploy: 1.先预置IAM用户: 创建一个IAM用户或使用一个与AWS相关联的用户; 复制以下的策略附加到IAM用户,向IAM用户赋予对codedeploy(及codedeploy所依赖的AWS服务和操作)的...

守护-创造
39分钟前
1
0
这可能是最详细的一线大厂Mysql面试题详解了

1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联; 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 从:io线程——在使用start slave 之后...

Java干货分享
49分钟前
3
0
人的精力是什么?如何强化精力

人的精力是什么? 人的精力是什么? 精力指精神和体力。精神包括一个人的精神状态,兴奋度,做事情的投入度,专注度,持续时间等。 人的精力来源 人的精力有4种来源,身体的、情感的、思想的和...

莫库什勒
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部