2016-02-11 7 views
81

Я хотел бы знать разницу между CompletableFuture, Future и ObservableRxJava.Разница между CompletableFuture, будущее и RxJava-х Наблюдаемые

Что я знаю все асинхронно, но

Future.get() блокирует нить

CompletableFuture дает методы обратного вызова

RxJava Observable --- подобные CompletableFuture с другими преимуществами (не уверен)

Например: , если клиенту необходимо выполнить несколько вызовов службы, и когда мы используем Futures (Java) Future.get() будет выполняться последовательно ... хотел бы знать, как его лучше в RxJava ..

И документация http://reactivex.io/intro.html говорит

трудно использовать фьючерсы, чтобы оптимально составить условный асинхронное выполнение потоков (или невозможно, поскольку задержки каждого запроса различаются во время выполнения). Это можно сделать, конечно, но это быстро усложняется (и, следовательно, подвержено ошибкам) ​​или преждевременно блокирует Future.get(), что устраняет преимущества асинхронного выполнения.

Действительно интересует, как RxJava решает эту проблему. Мне было трудно понять из документации. Пожалуйста, помогите!

+0

Вы прочитали документацию для каждого? Я совершенно не знаком с RxJava, но документация выглядит чрезвычайно тщательной с первого взгляда. Это не кажется особенно сопоставимым с двумя фьючерсами. – Vulcan

+0

Я прошел через, но не смог понять, как отличается его от Java-фьючерсов ... исправьте меня, если я ошибаюсь – shiv455

+0

Как наблюдаемые похожи на фьючерсы? – Vulcan

ответ

137

Фьючерсы

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. Они позволяют этим реактивным библиотекам соединяться, сохраняя при этом все важные противодавления.

+0

@ shiv455 Я перефразировал свой ответ на Rx. Кроме того, я рекомендую вам взглянуть на некоторые примеры RxJava, чтобы убедиться в этом: https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava – Malt

+0

Было бы неплохо привести пример кода как Rx делает это –

+0

Итак, используя реактивные потоки, мы можем смешивать RxJava, Akka и Vertx в одном приложении? –

4

Я работаю с Rx Java с 0.9, теперь на 1.3.2 и вскоре перехожу к 2.x. Я использую это в частном проекте, в котором я уже работаю 8 лет.

Я бы больше не программировал эту библиотеку. В начале я был скептичен, но это совершенно другое состояние ума, которое нужно создать. Quiete сложно в начале. Я иногда смотрел на мраморы в течение нескольких часов .. lol

Это просто вопрос практики и действительно знакомство с потоком (как договор наблюдаемых и наблюдателей), как только вы доберетесь туда, вы будете ненавидеть делать это иначе.

Для меня нет недостатка в этой библиотеке.

Use case: У меня есть вид монитора, который содержит 9 датчиков (процессор, память, сеть и т. Д.). При запуске представления представление подписывается на класс системного монитора, который возвращает наблюдаемый (интервал), который содержит все данные для 9 метров. Он будет толкать каждую секунду на новый результат (так что не опросить !!!). Этот наблюдаемый использует плоскую карту для одновременного (асинхронного!) Извлечения данных из 9 разных источников и застегивает результат в новую модель, которую ваш взгляд получит на onNext().

Как, черт возьми, вы будете делать это с помощью фьючерсов, готовых изделий и т. Д. ... Удачи! :)

Rx Java решает многие проблемы в программировании для меня, и делает таким образом намного проще ...

Преимущества:

  • Statelss !!!(Важно отметить, что самое главное, может быть)
  • управления потоками из коробки
  • Строительных последовательности, которые имеют свой собственный жизненный цикл
  • Все являются наблюдаемыми так сцеплением легко
  • Меньше кода, чтобы написать
  • Одноместный банку на пути к классам (очень легкий)
  • Высококвалифицированные одновременно
  • Нет обратного вызова ад больше
  • на основе подписчика (жесткий контракт betwee п потребитель и производитель)
  • стратегии противодавления (Автоматический выключатель т.п.)
  • Splendid обработка ошибок и восстановление
  • Очень приятно документация (мраморы < 3)
  • Полного контроль
  • Много больше ...

Недостатки: - трудно проверить

Thats'all:)

+2

~ "** Я бы больше не программировал эту библиотеку. **« Итак, RxJava - это все-все для всех программных проектов? –

Смежные вопросы