Java 高并发编程详解 9.0 Future(凭据)模式

Future模式

当一个任务任务执行时间很长,调用者正常会阻塞很久。为避免这种情况出现,可以先返回一个凭据给调用者。后面调用者通过这个凭据查看任务执行结果。异步非阻塞也是类似思想。

Future设计模式实现

  1. future接口
/**
 * 提供 获取执行确认结果和判断是否执行完成
 */
public interface Future<T> {
   
    // 返回计算后结果 该方法会陷入阻塞状态
    T get() throws InterruptedException;
    // 判断任务是否已经被执行完成
    boolean done();
}
  1. future接口实现类

/**
 * Future 接口的实现类
 * 增加finish方法 用来接收任务被完成的通知 设置任务执行结果
 */
public class FutureTask<T> implements Future<T> {
   
    // 任务执行结果
    private T result;
    // 任务是否被完成
    private boolean isDone = false;
    // 定义对象锁
    private final Object LOCK = new Object();

    @Override
    public T get() throws InterruptedException {
   
        synchronized (LOCK){
   
            // 任务没有被执行完阻塞
            while (!isDone){
   
                LOCK.wait();
            }
            // 执行完成后返回结果
            return result;
        }
    }

    // finish 方法用来接收任务被完成的通知 设置任务执行结果
    protected void finish(T result){
   
        synchronized (LOCK){
   
            // balking 设计模式
            if (isDone) return;
            //处理传入的result值 设置返回值 是否完成 唤醒阻塞休息室的线程
            this.result = result;
            this.isDone = true;
            LOCK.notifyAll();
        }
    }

    @Override
    public boolean done() {
   
        return this.isDone;
    }
}
  1. 设计提交任务接口

/**
 * 用于提交任务
 */
public interface FutureService<IN,OUT> {
   
    // 提供不需要返回值的任务提交方法  Future.get() 方法返回null
    Future<?> submit(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值