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ố documentation và Javadoc 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.
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
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
Làm thế nào là các quan sát tương tự như tương lai? – Vulcan