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

CompletableFuture,Future和RxJava的Observable之间的区别,第1张

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

期货

在Java
5(2004)中引入了期货。由于 *** 作尚未完成,它们基本上是占位符。 *** 作完成后,

Future
将包含该结果。例如, *** 作可以是提交给ExecutorService的Runnable或Callable实例。 *** 作的提交者可以使用该对象检查 *** 作isDone(),还是使用阻塞的get()方法等待 *** 作完成。
Future

例:

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}

可完成的未来

Java
8(2014)中引入了CompletableFutures。实际上,它们是常规期货的演变,受到了Guava库一部分的Google的Listenable
Futures的启发。它们是期货,还使您可以将任务按链条在一起。您可以使用它们来告诉某个工作线程“执行一些任务X,完成后,再使用X的结果来完成这件事”。使用CompletableFutures,您可以对 *** 作的结果执行某些 *** 作,而无需实际阻塞线程等待结果。这是一个简单的例子:

public static class MySupplier implements Supplier<Integer> {    @Override    public Integer get() {        try { Thread.sleep(1000);        } catch (InterruptedException e) { //Do nothing        }        return 1;    }}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创建的用于反应式编程的完整库。乍一看,它看起来类似于Java
8的stream。是的,只是功能更强大。

与Futures相似,RxJava可用于将一系列同步或异步 *** 作串在一起以创建处理管道。与一次性使用的Futures不同,RxJava在零个或多个项目
上工作。包括无数个项目的无休止的流。多亏了令人难以置信的丰富 *** 作员集合,它也更加灵活和强大。

与Java
8的流不同,RxJava还具有背压机制,使它可以处理处理管道的不同部分
以不同的速率 在不同的线程中运行的 情况

RxJava的缺点是,尽管有可靠的文档,但由于涉及到的范例转换,它是一个具有挑战性的库。Rx代码也可能是调试的噩梦,尤其是在涉及多个线程的情况下,甚至更糟-
如果需要背压。

如果您想了解它,则可以在官方网站上找到整页的各种教程,以及官方文档和Javadoc。您还可以看一下其中的一些视频,例如这段视频,简要介绍了Rx,还讨论了Rx和Futures之间的区别。

奖金:Java 9反应流

Java 9的反应式流(又名Flow
API)是由各种反应式流库(如RxJava 2,Akka Streams和Vertx)实现的一组接口。它们允许这些反应性库互连,同时保留所有重要的反压。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5092401.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存