Future模式

本文深入解析Java中的Future模式,介绍其核心结构与参与者,并通过具体示例演示如何使用Future模式来实现异步处理,提高程序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

广义的Future模式如下:
这里写图片描述
Future模式的主要参与者:
这里写图片描述

Future模式的核心结构如下:
这里写图片描述

Future模式的简单实现

核心接口Data,是用户需要获取的实现,它有2个实现:RealData,FutureData;

  • RealData:真实返回的数据;
  • FutureData:实现了一个快速返回的RealData的包装;可以很快被构造并返回;当使用FutureData的getResult()方法时,如果实际数据没有准备好,程序就会被阻塞,等待RealData准备好并注入到FutureData;(即它是RealData的代理,封装了获取RealData的等待过程)

JDK中的Future模式

JDK内置的future模式
Callable接口只有call()方法,会返回需要构造的实际数据。如果需要实现自己的业务系统,需要实现自己的callable对象。
通常会使用Callable实例构造一个FutureTask实例,并提交给线程池。
下面展示内置future模式的使用:

package future;

import java.util.concurrent.Callable;

/**
 * Created by  on 17/10/8.
 */
public class RealDataCallable implements Callable<String> {
    private String param;

    public RealDataCallable(String param) {
        this.param = param;
    }

    @Override
    public String call() throws Exception {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i< 10; i++) {
            sb.append(param);
            Thread.sleep(10);
        }
        return sb.toString();
    }
}
package future;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

/**
 * Created by lican on 17/10/8.
 */
public class FutureMain {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> futureTask = new FutureTask<String>(new RealDataCallable("a"));
        ExecutorService executorService = Executors.newFixedThreadPool(1);
        //执行futuretask,相当于client.request()发送请求
        //在这里开启线程进行RealData的call()执行;
        executorService.submit(futureTask);
        System.out.println("执行完毕");
        //模拟业务的额外业务逻辑处理
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //相当于data.getResult(),取得call()方法的执行)
        //如果call没有执行完毕,会依然等待
        System.out.print(futureTask.get());
    }
}

代码中,首先构造FutureTask对象实例,表示该任务有返回值;
构造FutureTask时,使用Callable接口,告诉FutureTask需要的数据如何产生;
FutureTask交给线程池,会立即返回,不会阻塞;然后业务不需要关心数据如何产生,可以去做额外的事,需要时通过Future.get方法得到;
Future接口的方法有:

boolean cancle(boolean may);
boolean isCancelled();
boolean isDone();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值