当前位置: 首页 > 知识库问答 >
问题:

CompletableFuture,Future和RXJava的Observable之间的区别

韩玉石
2023-03-14

我想知道completablefuturefutureobservablerxjava之间的区别。

我知道的是所有的都是异步的

RXJava Observable--与CompletableFuture类似,但有其他优点(不确定)

例如:如果客户端需要进行多个服务调用,并且当我们使用future(Java)future.get()时,将顺序执行...想知道如何在rxjava中更好...

文档http://reactivex.io/intr.html说

很想知道rxjava是如何解决这个问题的。我从文件中发现很难理解。

共有1个答案

易炳
2023-03-14

期货

Futures是在Java 5(2004)中引入的。它们基本上是一个尚未完成的操作结果的占位符。操作完成后,future将包含该结果。例如,操作可以是提交给ExecutorService的可运行或可调用实例。操作的提交者可以使用future对象检查操作是否为isDone(),或者使用阻塞get()方法等待其完成。

示例:

/**
* A task that sleeps for a second, then returns 1
**/
public static class MyCallable implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        Thread.sleep(1000);
        return 1;
    }

}

public static void main(String[] args) throws Exception{
    ExecutorService exec = Executors.newSingleThreadExecutor();
    Future<Integer> f = exec.submit(new MyCallable());

    System.out.println(f.isDone()); //False

    System.out.println(f.get()); //Waits until the task is done, then prints 1
}
/**
* A supplier that sleeps for a second, and then returns one
**/
public static class MySupplier implements Supplier<Integer> {

    @Override
    public Integer get() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            //Do nothing
        }
        return 1;
    }
}

/**
* A (pure) function that adds one to a given Integer
**/
public static class PlusOne implements Function<Integer, Integer> {

    @Override
    public Integer apply(Integer x) {
        return x + 1;
    }
}

public static void main(String[] args) throws Exception {
    ExecutorService exec = Executors.newSingleThreadExecutor();
    CompletableFuture<Integer> f = CompletableFuture.supplyAsync(new MySupplier(), exec);
    System.out.println(f.isDone()); // False
    CompletableFuture<Integer> f2 = f.thenApply(new PlusOne());
    System.out.println(f2.get()); // Waits until the "calculation" is done, then prints 2
}

RxJava

RxJava是Netflix创建的用于反应编程的完整库。乍一看,它似乎与Java8的流类似。是的,只是它的力量要大得多。

与Futures类似,可以使用RxJava将一堆同步或异步操作串在一起,以创建处理管道。与Futures不同的是,Futures是单次使用的,RxJava可以处理零个或多个项目的流。包括具有无限数量项的永无止境流。由于拥有丰富得难以置信的操作符集,它也更加灵活和强大。

Java9的Reactive Streams aka Flow API是由各种Reactive Streams库(如RXJava2、Akka Streams和Vertx)实现的一组接口。它们允许这些反应性库相互连接,同时保留所有重要的背压。

 类似资料:
  • 问题内容: 我想知道的区别 ,和 。 我所知道的都是异步的,但是 阻塞线程 提供回调方法 -– 与其他好处相似(不确定) 例如:如果客户端需要进行多个服务调用,并且当我们使用(Java)时将依次执行…希望了解其在RxJava中的效果如何。 并且文档http://reactivex.io/intro.html说 很难使用Future来最佳地组成条件异步执行流(或者是不可能的,因为每个请求的延迟在运行

  • 问题内容: Scala Future和Java Future之间在概念,功能或机械方面是否存在差异?从概念上讲,我看不到任何差异,因为它们都旨在提供异步计算机制。 问题答案: 主要的不便之处在于,如果没有阻塞,就无法获得价值。 实际上,检索值的唯一方法是方法,即方法(引用docs) 等待必要的计算完成,然后检索其结果。 有了你,而不是一个真正的无阻塞的计算,因为你可以将回调完成(成功/失败),或简

  • 今天我发现,对于java中的并发,我们有像这样的好框架,我还发现,有一个像这样的反应式编程框架,用于在应用程序中执行。但是我仍然很困惑!为什么两者都比框架好? 如今,反应式编程是一个成熟的话题,大多数语言都支持函数式反应式编程,例如为不止一种语言提供有关的API。是用于、等的API之一。根据,他们在内部使用参与者来维护和也使用进行编程。 那么,Akka和反应式编程方法之间的区别是什么?为什么它们在

  • 在Java最近几个主要版本的每一次迭代中,似乎都有管理并发任务的新方法。 在Java9中,我们有Flow API,它类似于RxJava的Flowable API,但在Java9中,它有一组简单得多的类和接口。 Java 9 具有类似流API的类的完整包,即、、、,它们似乎做了类似的事情。 这两个库的主要区别是什么?为什么有人会使用Java9Flow库而不是更多样化的RxJava库,或者反之亦然?

  • 这里的输出将是2。现在,对于: 我在这篇博客中读到,每个在一个单独的线程中执行,并且“同时”(这意味着在前面的完成之前启动)。如果是,如果第一步没有完成,第二步的输入参数值是什么? 如果没有第二步迈出,第一步的成果将何去何从?第三步会采取哪一步的结果?

  • 问题内容: 在最近几个主要版本的Java的每次迭代中,似乎都有一致的新方法来管理并发任务。 在Java中9,我们有流API这类似于可流动API RxJava,但与Java 9有一个更简单的一组类和接口。 Java 9 有,,,,和,这就是它。 RxJava的 拥有全 包 的流API状类,即,,,,和这似乎做同样的事情。 这两个库之间的主要区别是什么?为什么有人会使用Java 9 Flow库而不是种