Promise模式

Promise模式

一种异步编程的模式,使得我们可以先开始一个任务的执行,并得到一个用于获取该任务执行结果的凭据对象,不用去等该任务执行完成可以执行其他操作,在生活中我们也经常会运用其中的思想,比如我们去一家小吃店点了一份鸭血粉丝和一份小笼包,会发一份凭据,鸭血粉丝比较快做好,我们可以不用等待小笼包做好,先吃鸭血粉丝,等到吃的差不多了,小笼包也可能出笼了,我们可以凭着发票换取小笼包。

吃早餐的两两种执行方式

同步等待的方式:
开始点完餐
开始吃鸭血粉丝
吃完鸭血粉丝
等待小笼包做好
开始吃小笼包
吃完小笼包
异步的方式:
开始点完餐
开始吃鸭血粉丝
等待小笼包做好
吃完鸭血粉丝
开始吃小笼包
吃完小笼包
//同步的方式执行我们知道是最耗时的
//异步的方式,也存在一个问题,我们先看代码
public class Test {

    public static void main(String[] args) throws Exception{
        long starTime = System.currentTimeMillis();
        Thread thread = new Thread(()->{
            System.out.println("开始吃鸭血粉丝");
            try {
                Thread.sleep(5*1000);
            }catch (Exception e){
                e.printStackTrace();
            }
            System.out.println("吃完鸭血粉丝");
        });
        thread.start();
        System.out.println("等到小笼包");
        System.out.println("开始吃小笼包");
        Thread.sleep(3*1000);
        System.out.println("吃完小笼包");
        long endTime = System.currentTimeMillis();
        System.out.println("一共耗时:"+(endTime-starTime)+"ms");
    }
}

请添加图片描述
从结果上我们可以看到,主线程已经结束了,但是任务1(鸭血粉丝还没有吃完)还没有执行完。此时就需要用到我们的Promise模式。

Promise模式介绍

Promise模式主要是由4个部分构成:
  1. Promisor 负责对外暴露可以返回Promise对象的异步方法compute(),并启动异步执行任务
    Compute方法:启动异步任务的执行,返回promise对象
  2. TaskExecutor 负责真正执行的异步任务,在Promisor定义的任务,由TaskExecutor来执行
  3. Promise Promisor的compute方法返回的凭据对象,主要负责检查异步任务是否完成,返回异步任务的处理结果
    get 获取异步任务的执行结果
    isDone 检测异步任务是否执行完毕
  4. Result
    异步任务的处理结果

代码实现过程:

public class Baozi {
    boolean status = false;

    public boolean isStatus() {
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }
}
public class Promisor {
    public static Future<Object> compute(){
        FutureTask<Object> futureTask = new FutureTask<>(()->{
            System.out.println("开始做小笼包");
            Baozi baozi = new Baozi();
            Thread.sleep(2*1000);
            baozi.setStatus(true);
            return baozi;
        });
        new Thread(futureTask).start();
        return futureTask;
    }
}

public class Test {

    public static void main(String[] args) throws Exception{
        long startTime = System.currentTimeMillis();
        Future<Object> promisor = Promisor.compute();
        System.out.println("开始吃鸭血粉丝");
        Thread.sleep(7*1000);
        System.out.println("鸭血粉丝吃完");

        if(!promisor.isDone()){
            System.out.println("等待小笼包做好");
        }
        Baozi baozi = (Baozi)promisor.get();
        System.out.println("得到包子做完信号");
        System.out.println("开始吃包子");
        System.out.println("一共耗时:"+(System.currentTimeMillis()-startTime)+"ms");
    }
}

返回结果

请添加图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,并没有内置的Promise类,但是可以使用一些库或框架来实现Promise的功能。其中一个常用的库是CompletableFuture,它提供了一个强大的异步编程工具,可以用来处理异步任务的完成或失败。 使用CompletableFuture,你可以通过以下步骤创建和使用Promise: 1. 创建一个CompletableFuture对象,可以通过CompletableFuture类的静态方法提供一个初始值,或者使用构造函数创建一个空的CompletableFuture对象。 2. 使用`thenApply()`、`thenAccept()`、`thenRun()`等方法,将回调函数附加到CompletableFuture对象上。这些方法允许你定义在Future完成时要执行的操作。 3. 在合适的时候,通过调用CompletableFuture的`complete()`、`completeExceptionally()`、`cancel()`等方法,将结果或异常传递给CompletableFuture对象。 4. 当你需要等待CompletableFuture的完成时,可以使用`get()`方法阻塞当前线程,直到Future完成并返回结果。你还可以使用`join()`方法等待Future的完成,但不会抛出异常。 总的来说,CompletableFuture提供了一种简洁而灵活的方式来处理异步任务的结果。它允许你链式地组合多个异步操作,并在每个操作完成后执行特定的操作。 是Netty4源码中的一段代码,展示了如何在Promise对象中添加监听器并触发相应的回调函数。 是一个使用Promise的典型例子,在这个例子中,使用Promise来处理异步的AJAX请求。 提到了Java中实现Promise模式的另一个类:FutureTask。FutureTask是Java标准库中实现了Future接口的具体类,可以看作是Promise模式的参与者实例。 综上所述,虽然Java中没有内置的Promise类,但是可以使用CompletableFuture等库来实现Promise的功能。这些库提供了一种方便的方式来处理异步任务的完成和失败,并允许你以链式的方式组合多个异步操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值