2016-02-11 47 views
81

我想知道 CompletableFutureFutureObservableRxJava之间的区别。CompletableFuture,Future和RxJava的Observable之间的区别

我知道什么是所有的都是异步的,但

Future.get()块线程

CompletableFuture给出了回调方法

RxJava Observable ---类似CompletableFuture与其他利益(不知道)

对于例如: 如果客户端需要拨打多个服务电话以及我们使用Futures(Java)Future.get()将被执行顺序...想知道如何RxJava其破越好..

和文档http://reactivex.io/intro.html

这是很难用期货来优化组合条件异步执行流(或根本不可能,因为每个请求的延迟会在运行时发生变化)。当然,这可以完成,但它很快变得复杂(并且容易出错),或者它过早地阻塞了Future.get(),这消除了异步执行的好处。

真的很想知道RxJava如何解决这个问题。我发现很难从文档中理解。请帮助!

+0

您是否阅读过每个文档的文档?我对RxJava完全不熟悉,但文档一目了然。这与两个期货似乎并不具有可比性。 – Vulcan

+0

我已经经历了,但无法得到它与J​​ava未来有多大的不同......纠正我,如果我错了 – shiv455

+0

如何观察类似于期货? – Vulcan

回答

137

期货

Futures在Java 5中(2004年)进行了介绍。它们是承诺在操作完成后保留操作结果的对象。例如,当任务(即RunnableCallable)被提交给执行者时。呼叫者可以使用未来对象来检查操作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 
} 

CompletableFutures

CompletableFutures用Java 8(2014)进行了介绍。它们实际上是由谷歌的Listenable FuturesGuava库的一部分)启发的定期期货的演变。他们是期货,也允许你在一个链中串起任务。你可以用它们来告诉一些工作者线程“去做一些任务X,等你完成后,用X的结果去做这件事情”。这里有一个简单的例子:

/** 
* 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公司创造了reactive programming整个图书馆。一目了然,它看起来与Java 8's streams类似。它是,除了它更强大。

与期货类似,RxJava可用于将一堆同步或异步操作串起来以产生一个或多个有意义的结果。然而,不像期货一次性使用,RxJava的数据流可以处理零个或多个项目,包括具有无限数量项目的永无止境的流。它的灵活性和流畅性也得益于令人难以置信的丰富set of operators

与Java 8的流不同,RxJava有一个backpressure机制,它允许它处理不同部分处理流在不同线程中以不同速率运行的情况。

RxJava的不足之处在于,尽管文档相当好,但由于涉及到范式转换,它是一个具有挑战性的图书馆。 Rx代码也可能成为调试的噩梦,特别是涉及多个线程时,甚至更糟 - 如果需要回压。如果你想进入它,官方网站上有各种教程的整个page,加上官方的documentationJavadoc。您还可以查看一些视频,例如this one,其中介绍了Rx的简要介绍,并讨论了Rx和期货之间的区别。

加成:爪哇9个反应流

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

+0

@ shiv455我已经在Rx上重述了我的答案。此外,我建议你看看一些RxJava的例子,只是为了感受它:https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava – Malt

+0

很高兴给出示例代码Rx如何做到这一点 –

+0

因此,使用Reactive Streams,我们可以在一个应用程序中混合使用RxJava,Akka和Vertx? –

4

从0.9开始,我一直在使用Rx Java,现在在1.3.2并且很快迁移到2.x我在一个已经工作了8年的私人项目中使用它。

我不会在没有这个库的情况下编程。一开始我很怀疑,但它是你需要创造的完整的其他心态。 Quiete在一开始很困难。我有时在看着弹珠几个小时..大声笑

这只是一个实践问题,真正了解流动(也称为观察者和观察者的合同),一旦你到达那里,你会讨厌做否则。

对我来说,这个图书馆没有真正的缺点。

使用案例: 我有一个监视器视图,其中包含9个仪表(CPU,MEM,网络等...)。启动视图时,视图将自己订阅到一个系统监视器类,该类将返回一个包含9米的所有数据的可观察(间隔)。 它会每秒向视图推送一个新的结果(所以不要轮询!!!)。 observable使用flatmap同时(异步!)从9个不同的来源获取数据,并将结果压缩到您的视图将在onNext()上获得的新模型。

你会怎么做到这一点与期货,补充等等......祝你好运! :)

的Rx的Java解决了编程的许多问题,我和让的方式轻松很多......

优点:

  • Statelss!(重要的是要提的,也许最重要的)
  • 线程管理开箱即有自己的生命
  • 生成序列
  • 一切都观测所以链接很容易
  • 更少的代码编写
  • 单罐子上的类路径(非常轻巧)
  • 高度并发的
  • 没有回调地狱了
  • 基于订户(紧合同betwee ñ消费者和生产者)
  • 背压策略(断路器等)
  • 锦绣错误处理和恢复
  • 非常漂亮的文档(弹子< 3)
  • 完全控制
  • 许多更多...

缺点: - 难以测试

Thats'all: )

+2

〜“**如果没有这个库,我就不会再编程了。”所以RxJava是所有软件项目的最终目标? –