期货
期货是在Java 5(2004)中引入的。它们基本上是尚未完成的操作结果的占位符。操作完成后,将包含该结果。例如,操作可以是提交到执行器服务的可运行或可调用实例。操作的提交者可以使用该对象来检查操作是否为Done(),或者使用阻塞 get() 方法等待它完成。Future
Future
例:
/**
* 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在Java 8(2014)中引入。它们实际上是常规期货的演变,灵感来自谷歌的Listenable Futures,这是番石榴图书馆的一部分。它们是期货,还允许您将任务串成一个链。你可以用它们来告诉一些工作线程“去做一些任务X,当你完成之后,去用X的结果去做其他事情”。使用ComppletableFutures,您可以对操作结果执行某些操作,而无需实际阻塞线程以等待结果。下面是一个简单的示例:
/**
* 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创建的用于反应式编程的整个库。乍一看,它似乎类似于Java 8的流。它是,除了它更强大。
与 Futures 类似,RxJava 可用于将一堆同步或异步操作串在一起,以创建处理管道。与一次性期货不同,RxJava适用于零个或多个项目的流。包括具有无限数量项目的永无止境的流。由于一组令人难以置信的丰富运算符,它也更加灵活和强大。
与Java 8的流不同,RxJava还具有背压机制,它允许它处理处理管道的不同部分以不同的速率在不同线程中运行的情况。
RxJava的缺点是,尽管有可靠的文档,但由于涉及范式转变,它是一个具有挑战性的学习库。Rx代码也可能是调试的噩梦,特别是如果涉及多个线程,更糟糕的是 - 如果需要背压。
如果你想进入它,官方网站上有一整页的各种教程,加上官方文档和Javadoc。您还可以查看一些视频,例如这个视频,它简要介绍了Rx,并讨论了Rx和Futures之间的差异。
奖励:Java 9 Reactive Streams
Java 9的Reactive Streams(又名Flow API)是由各种反应式流库(如RxJava 2,Akka Streams和Vertx)实现的一组接口。它们允许这些反应式库互连,同时保持所有重要的背压。