做蛋糕--Future模式

一、什么是future模式

future模式可以认为是一种票据。这个票据是在任务提交时,就获得,可先继续处理其他事情。过一段时间后,再使用票据查询任务的执行结果,或者利用callback机制,任务告知己方处理结果。

二、好处:

避免己方系统的卡顿充分利用系统资源,提高系统效率。

三、适用的场景

在和第三方系统对接的过程中,为了避免因为调用第三方系统的延迟,导致整个系统的卡顿。

将第三方的调用,使用FutureTask的方式处理。

四、举例

做蛋糕

  • 收据---Future
//Future<T>

/**
 * 获取任务结果
 * @param <T>
 */
public interface Future<T> {
    T get() throws InterruptedException;
}

实现类


public class BreadFuture<T> implements Future<T> {

    private volatile boolean done = false;

    private T result;

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

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

做蛋糕任务---FutureTask


/**
 * 具体做什么任务
 * @param <T>
 */
public interface FutureTask<T> {

    T call();
}

 

业务接口---FutureTaskService


/**
 * 业务方法
 */
public interface FutureService {

    <T> Future<T> submit(final FutureTask<T> futureTask);
}

实现类


public class BreadFutureServiceImpl implements FutureService{

    @Override
    public <T> Future<T> submit( final FutureTask<T> futureTask) {
        BreadFuture<T> future = new BreadFuture<>();

        new Thread(() ->{
            T result = futureTask.call();
            future.done(result);
        }).start();

        return future;
    }
}

测试场景
 


public class BreadTask {

    public static void main(String[] args) throws Exception {
        System.out.println("顾客:来做蛋糕了,交流需求");
        Thread.sleep(10000l);

        System.out.println("蛋糕店:您可以休息下,做好叫你。");
        BreadFutureServiceImpl breadFutureService = new BreadFutureServiceImpl();

        Future<String> future = breadFutureService.submit(() -> {
            System.out.println("蛋糕店:开始处理");
            try {
                Thread.sleep(10000l);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "蛋糕店:做完了";
        });

        System.out.println("顾客:我去休息了");
        Thread.sleep(5000l);
        System.out.println(future.get());
        System.out.println("顾客:谢谢");

    }
}

测试结果

发布了66 篇原创文章 · 获赞 16 · 访问量 7万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览