博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程基础(十一)——Future模式
阅读量:6148 次
发布时间:2019-06-21

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

一、定义

Future模式用来获取线程的执行结果。在Thread-Per-Message模式中,如果调用一个线程异步执行任务,没有办法获取到返回值,就像:

host.request(10,'A');
而Future模式送出请求后,马上就要获取返回值,就像:
Data data=host.request(10,'A');
但是上述的返回值并不是程序的执行结果,因为线程是异步的,主线程调用该该方法时,异步线程可能才刚刚启动。需要一段时间后像下面这样获取执行结果:
data.getContent();

二、模式案例

Data接口/实现:

public interface Data {    public abstract String getContent();}
public class RealData implements Data {    private final String content;    public RealData(int count, char c) {        System.out.println("        making RealData(" + count + ", " + c + ") BEGIN");        char[] buffer = new char[count];        for (int i = 0; i < count; i++) {            buffer[i] = c;            try {                Thread.sleep(100);            } catch (InterruptedException e) {            }        }        System.out.println("        making RealData(" + count + ", " + c + ") END");        this.content = new String(buffer);    }    public String getContent() {        return content;    }}
public class FutureData implements Data {    private RealData realdata = null;    private boolean ready = false;    public synchronized void setRealData(RealData realdata) {        if (ready) {            return;        }        this.realdata = realdata;        this.ready = true;        notifyAll();    }    public synchronized String getContent() {        while (!ready) {            try {                wait();            } catch (InterruptedException e) {            }        }        return realdata.getContent();    }}

Host类:

public class Host {    public Data request(final int count, final char c) {        System.out.println("    request(" + count + ", " + c + ") BEGIN");        final FutureData future = new FutureData();        new Thread() {            public void run() {                RealData realdata = new RealData(count, c);                future.setRealData(realdata);            }        }.start();        System.out.println("    request(" + count + ", " + c + ") END");        return future;    }}

执行:

public class Main {    public static void main(String[] args) {        System.out.println("main BEGIN");        Host host = new Host();        Data data1 = host.request(10, 'A');        Data data2 = host.request(20, 'B');        Data data3 = host.request(30, 'C');         System.out.println("main otherJob BEGIN");        try {            Thread.sleep(2000);        } catch (InterruptedException e) {        }        System.out.println("main otherJob END");        System.out.println("data1 = " + data1.getContent());        System.out.println("data2 = " + data2.getContent());        System.out.println("data3 = " + data3.getContent());        System.out.println("main END");    }}

三、模式讲解

Future模式的角色如下:

  • Client(委托人)参与者

Client参与者会向Host参与者送出请求(request),Client参与者会马上得到VirtualData,作为请求结果的返回值。(案例中的Main类就是Client)

  • Host参与者

Host参与者接受请求(request),然后创建线程进行异步处理。Host参与者会立即返回Future(以VirturalData的形式)。

  • VirtualData(虚拟数据)参与者

VirtualData是用来统一代表Future参与者与RealData参与者。(案例中Data接口就是VirtualData参与者)

  • RealData(实际数据)参与者

RealData表示实际的数据。

  • Future参与者

Future参与者包含获取实际的数据和设置实际数据的方法。Host类会创建该对象,当异步线程处理完成时,会调用Future的设置数据的方法。

转载地址:http://qgmya.baihongyu.com/

你可能感兴趣的文章
[转]VC预处理指令与宏定义的妙用
查看>>
JQuery radio单选框应用
查看>>
MySql操作
查看>>
python 解析 XML文件
查看>>
MySQL 文件导入出错
查看>>
java相关
查看>>
由一个异常开始思考springmvc参数解析
查看>>
向上扩展型SSD 将可满足向外扩展需求
查看>>
jenkins updatecenter更新插件有问题
查看>>
我的友情链接
查看>>
SQL Server -- T-SQL 编码标准
查看>>
分布式文件系统MogileFS介绍
查看>>
linux下如何挂接(mount)光盘镜像文件、移动硬盘、U盘、Windows网络共享和NFS网络共享...
查看>>
shell逻辑控制语句之case
查看>>
Deep Freeze(冰点还原精灵)在托盘出消失及显示
查看>>
vcenter Converter 转换linux服务器报错
查看>>
安装graylog2日志服务器
查看>>
vfp_背景问题
查看>>
老毛桃winpe官网
查看>>
C optimization tutorial 翻译 C语言优化教程(一)
查看>>