Фьючерсы
Futures были введены в Java 5 (2004). Это объекты, которые обещают удерживать результат операции после завершения этой операции. Например, когда задача (то есть Runnable или Callable) представляется исполнителю. Вызывающий может использовать будущий объект для проверки работы 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 Futures Google, частью библиотеки Guava. Это Futures, которые также позволяют объединять задачи в цепочку. Вы можете использовать их, чтобы сообщить некоторому рабочему потоку «пойти на выполнение какой-то задачи 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 это целая библиотека для reactive programming создан Netflix. С первого взгляда он будет похож на Java 8's streams. Это, за исключением того, что оно намного мощнее.
Аналогично Futures, RxJava может использоваться для объединения вместе синхронных или асинхронных действий для получения одного или нескольких значимых результатов. Однако, в отличие от Futures, которые являются одноразовыми, RxJava работает с потоками из ноля или более предметов, включая бесконечные потоки с бесконечным количеством элементов. Он также намного более гибкий и плавный благодаря невероятно богатому set of operators.
В отличие от потоков Java 8, RxJava имеет механизм backpressure, который позволяет обрабатывать случаи, в которых разные части вашего потока обработки работают в разных потоках с разной скоростью.
Недостатком RxJava является то, что, несмотря на довольно хорошую документацию, это сложная библиотека, которую вы узнаете из-за смены парадигмы. Rx-код также может быть кошмаром для отладки, особенно если задействованы несколько потоков, а еще хуже - если требуется обратное давление. Если вы хотите войти в него, на официальном сайте есть целые page различных учебных пособий, а также официальные documentation и Javadoc. Вы также можете посмотреть некоторые из видео, такие как this one, который дает краткое введение в Rx, а также рассказывает о различиях между Rx и Futures.
Бонус: Java 9 Реактивные Streams
Java 9's Reactive Streams ака Flow API представляют собой набор интерфейсов, реализуемых различными reactive streams библиотек, таких как RxJava 2, Akka Streams и Vertx. Они позволяют этим реактивным библиотекам соединяться, сохраняя при этом все важные противодавления.
Вы прочитали документацию для каждого? Я совершенно не знаком с RxJava, но документация выглядит чрезвычайно тщательной с первого взгляда. Это не кажется особенно сопоставимым с двумя фьючерсами. – Vulcan
Я прошел через, но не смог понять, как отличается его от Java-фьючерсов ... исправьте меня, если я ошибаюсь – shiv455
Как наблюдаемые похожи на фьючерсы? – Vulcan