2016-02-11 43 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是所有軟件項目的最終目標? –