Future设计模式


前言

生活中我们为了完成一件事或者达成一个目标,常常需要别人来帮助,比如:我们要定制某个商品,我们需要商家去帮我们定制完成。再比如,我们要去干洗店洗衣间棉袄。正常情况下我们不会傻乎乎的等商家帮我们定制完成商品,或者让干洗店洗完棉袄,我们才去干自己的事情。一般我们都是把事情交给别人后,直接去干自己的事情了,等我们忙完自己的事情之后再去店里取订制品或者棉袄,或者让商家直接给我们寄回家。java并发编程种模拟这种实际情况,于是就有了未来设计模式(Future Design pattern)


一、什么是未来设计模式?

未来设计模式就是,我们把事情交给别人,自己直接先去干别的事情,在未来的某个时间我们才去哪交给别人去做的事情的结果,或者让消费者在别人完成我们的事情后消费掉这个结果。

二、代码示例

1.Future

定义Future接口,定义get()方法,用来获取我们想要的结果

package future;

public interface Future<T> {
    T get() throws InterruptedException;
}

2.Future实现类

实现get方法,定义done方法

package future;

public class AsyncFuture<T> implements Future<T> {
    private volatile boolean done = false;
    private T result;

    public synchronized void done(T result) {
        this.result = result;
        this.done = true;
        this.notifyAll();
    }

    @Override
    public synchronized T get() throws InterruptedException {
        while (!done) {
            this.wait();
        }
        return result;
    }
}

3.FutureService

Future服务类,定义submit方法,用来提交任务(相当于我们的任务交给别人)

package future;

import java.util.function.Consumer;

public class FutureService {
    public <T> Future<T> submit(FutureTask<T> task, Consumer<T> consumer) {
        AsyncFuture<T> asyncFuture = new AsyncFuture<>();
        new Thread(() -> {
            T result = null;
            try {
                result = task.call();
                asyncFuture.done(result);
                consumer.accept(result);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        return asyncFuture;
    }
}

4.FutureTask

定义任务,函数式接口

package future;

public interface FutureTask<T> {
    T call() throws InterruptedException;
}


5.客户端

定义任务,函数式接口

package future;

public class FutureClient {
    public static void main(String[] args) throws InterruptedException {
        FutureService futureService = new FutureService();
        futureService.submit(() -> {
            Thread.sleep(10000L);
            return "HELLO FUTURE";
        }, System.out::println);
        System.out.println("====================");
        Thread.sleep(1000L);
        System.out.println("主线程执行结束了");
    }
}

6.执行结果

主线程没有被阻塞,直接往下执行,同时,我们的任务也同时执行,10s后我们的任务完成,记过被消费,打印出来

====================
主线程执行结束了
HELLO FUTURE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值