2016-02-11 18 views
81

Tôi muốn biết sự khác biệt giữa CompletableFuture, FutureObservableRxJava.Sự khác biệt giữa CompletableFuture, Future và RxJava's Observable

gì tôi biết là tất cả đều không đồng bộ nhưng

Future.get() khối thread

CompletableFuture cung cấp cho các phương thức callback

RxJava Observable --- tương tự như CompletableFuture với lợi ích khác (không chắc chắn)

Ví dụ: nếu khách hàng cần thực hiện nhiều cuộc gọi dịch vụ và khi chúng tôi sử dụng Futures (Java) Future.get() sẽ được thực hiện tuần tự ... muốn biết làm thế nào tốt hơn của nó trong RxJava ..

Và các tài liệu http://reactivex.io/intro.html nói

Rất khó để sử dụng Futures để tối ưu soạn điều kiện thực hiện không đồng bộ dòng (hoặc không thể, vì độ trễ của mỗi yêu cầu thay đổi theo thời gian chạy). Điều này có thể được thực hiện, tất nhiên, nhưng nó nhanh chóng trở nên phức tạp (và do đó dễ bị lỗi) hoặc nó sớm chặn trên Future.get(), loại bỏ lợi ích của việc thực thi không đồng bộ.

Thực sự quan tâm để biết cách RxJava giải quyết vấn đề này.Tôi thấy khó hiểu từ tài liệu.Xin vui lòng trợ giúp!

+0

Bạn đã đọc tài liệu cho từng tài liệu chưa? Tôi hoàn toàn không quen thuộc với RxJava, nhưng tài liệu xuất hiện rất kỹ lưỡng trong nháy mắt. Nó không có vẻ đặc biệt so sánh với hai tương lai. – Vulcan

+0

tôi đã trải qua nhưng không thể có được sự khác biệt của nó từ tương lai Java ... sửa tôi nếu im sai – shiv455

+0

Làm thế nào là các quan sát tương tự như tương lai? – Vulcan

Trả lời

137

Futures

Futures đã được giới thiệu trong Java 5 (2004). Chúng là các đối tượng hứa hẹn sẽ giữ kết quả của một phép toán khi hoạt động đó hoàn tất. Ví dụ: khi một tác vụ (ví dụ: Runnable hoặc Callable) được gửi cho một người thi hành. Người gọi có thể sử dụng đối tượng tương lai để kiểm tra xem hoạt động isDone() hay đợi nó kết thúc bằng cách sử dụng get().

Ví dụ:

/** 
* 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 đã được giới thiệu trong Java 8 (2014). Trên thực tế, chúng là sự tiến hóa của tương lai thường được lấy cảm hứng từ số Listenable Futures của Google, một phần của thư viện Guava. Họ là những tương lai mà cũng cho phép bạn chuỗi nhiệm vụ với nhau trong một chuỗi. Bạn có thể sử dụng chúng để nói một số chuỗi công nhân để "đi làm một số nhiệm vụ X, và khi bạn hoàn thành, hãy làm điều này bằng cách sử dụng kết quả của X". Dưới đây là một ví dụ đơn giản:

/** 
* 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 là toàn bộ thư viện cho reactive programming tạo ra bởi Netflix. Trong nháy mắt, nó sẽ xuất hiện tương tự như Java 8's streams. Đó là, ngoại trừ nó mạnh hơn nhiều.

Tương tự như Futures, RxJava có thể được sử dụng để kết hợp chuỗi hành động đồng bộ hoặc không đồng bộ để tạo ra một hoặc nhiều kết quả có ý nghĩa. Tuy nhiên, không giống như Futures, sử dụng một lần, RxJava hoạt động trên luồng không có hoặc nhiều mục bao gồm các luồng không bao giờ kết thúc với số lượng mục vô hạn. Nó cũng linh hoạt hơn và trôi chảy hơn nhờ có một số set of operators không thể tin được.

Không giống như luồng Java 8, RxJava có cơ chế backpressure, cho phép xử lý các trường hợp trong đó các phần khác nhau trong luồng xử lý của bạn hoạt động theo các chủ đề khác nhau.

Nhược điểm của RxJava là mặc dù tài liệu khá tốt, đó là một thư viện đầy thử thách để tìm hiểu do sự chuyển đổi mô hình liên quan. Mã Rx cũng có thể là một cơn ác mộng để gỡ lỗi, đặc biệt nếu có nhiều chủ đề liên quan, và thậm chí tệ hơn - nếu áp lực ngược là cần thiết. Nếu bạn muốn tham gia, có toàn bộ page các hướng dẫn khác nhau trên trang web chính thức, cộng với số documentationJavadoc chính thức. Bạn cũng có thể xem một số video như this one, nó đưa ra phần giới thiệu ngắn gọn về Rx và cũng nói về sự khác biệt giữa Rx và tương lai.

Bonus: Java 9 phản Streams

Java 9's Reactive Streams aka Flow API là một tập hợp các giao diện được thực hiện bởi nhiều reactive streams thư viện như RxJava 2, Akka Streams, và Vertx. Chúng cho phép các thư viện tương tác này kết nối với nhau, đồng thời bảo toàn tất cả các áp suất ngược quan trọng.

+0

@ shiv455 Tôi đã lặp lại câu trả lời của mình trên Rx. Ngoài ra, tôi khuyên bạn hãy xem một số ví dụ về RxJava, chỉ để có được cảm nhận về nó: https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava – Malt

+0

Sẽ rất hay để cung cấp mã ví dụ về cách Rx thực hiện điều này –

+0

Vì vậy, bằng cách sử dụng Dòng phản ứng, chúng ta có thể trộn RxJava, Akka và Vertx trong một ứng dụng? –

4

Tôi đã làm việc với Rx Java từ 0.9, hiện tại là 1.3.2 và sớm di chuyển sang 2.x Tôi sử dụng điều này trong một dự án riêng tư mà tôi đã làm việc trong 8 năm.

Tôi sẽ không còn lập trình mà không có thư viện này nữa. Ban đầu tôi đã hoài nghi nhưng đó là một trạng thái hoàn toàn khác của tâm trí bạn cần phải tạo ra. Quiete khó khăn trong đầu. Đôi khi tôi nhìn vào viên bi trong nhiều giờ .. lol

Nó chỉ là vấn đề thực tế và thực sự biết được dòng chảy (còn gọi là hợp đồng quan sát và người quan sát), một khi bạn đến đó, bạn sẽ ghét phải làm nếu không.

Đối với tôi, đó không thực sự là một nhược điểm trên thư viện đó.

Trường hợp sử dụng: Tôi có chế độ xem màn hình có 9 đồng hồ đo (cpu, mem, mạng, v.v ...). Khi khởi động chế độ xem, chế độ xem tự đăng ký với một lớp giám sát hệ thống trả về một khoảng thời gian quan sát (có thể chứa) tất cả dữ liệu cho 9 mét. Nó sẽ đẩy mỗi giây một kết quả mới để xem (vì vậy không bỏ phiếu !!!). Quan sát được có thể sử dụng một bản đồ phẳng để đồng thời (không đồng bộ!) Tìm nạp dữ liệu từ 9 nguồn khác nhau và nén kết quả vào một mô hình mới mà khung nhìn của bạn sẽ nhận được trên onNext().

Làm thế nào địa ngục bạn sẽ làm điều đó với tương lai, hoàn thành vv ... Chúc may mắn! :)

Rx Java giải quyết được nhiều vấn đề trong lập trình cho tôi và làm một cách dễ dàng hơn rất nhiều ...

Ưu điểm:

  • Statelss !!!(Điều quan trọng cần đề cập, quan trọng nhất có thể)
  • quản lý đề ra khỏi hộp
  • trình tự xây dựng có vòng đời riêng của họ
  • Tất cả mọi thứ đều quan sát rất chaining là dễ dàng
  • Ít mã để viết
  • Độc thân jar vào classpath (rất nhẹ)
  • cao đồng thời
  • Không gọi lại địa ngục nữa
  • Subscriber dựa (hợp đồng chặt chẽ betwee n người tiêu dùng và nhà sản xuất)
  • chiến lược Backpressure (ngắt mạch một loại tương tự)
  • xử lý lỗi Splendid và khôi phục
  • tài liệu rất đẹp (bi < 3)
  • Kiểm soát hoàn toàn
  • Nhiều hơn ...

Nhược điểm: - Khó kiểm tra

Thats'all:)

+2

~ "** Tôi sẽ không lập trình mà không có thư viện này nữa. **" Vì vậy, RxJava là kết thúc tất cả tất cả cho tất cả các dự án phần mềm? –

Các vấn đề liên quan