[java] CompletableFuture, Future 및 RxJava의 Observable의 차이점

나는 사이의 차이를 알고 싶습니다
CompletableFuture, Future그리고 Observable RxJava.

내가 아는 것은 모두 비동기이지만

Future.get() 실을 막다

CompletableFuture 콜백 메소드를 제공합니다

RxJava ObservableCompletableFuture다른 혜택 과 유사 (확실하지 않음)

예를 들어, 클라이언트가 여러 서비스 호출을해야하고 Futures(Java) Future.get()를 사용할 때 순차적으로 실행되는 경우 … RxJava에서 어떻게 더 나은지 알고 싶습니다.

그리고 http://reactivex.io/intro.html 문서 는 말합니다

선물을 사용하여 조건부 비동기 실행 흐름을 최적으로 구성하는 것은 어렵습니다 (또는 각 요청의 대기 시간은 런타임에 따라 다르므로 불가능합니다). 물론이 작업을 수행 할 수는 있지만 빠르게 복잡해 지거나 오류가 발생하기 쉬워 지거나 Future.get ()에서 조기에 차단되므로 비동기 실행의 이점이 사라집니다.

RxJava이 문제를 어떻게 해결 하는지 알고 싶습니다 . 설명서에서 이해하기 어렵다는 것을 알았습니다.



답변

선물

선물 은 Java 5 (2004)에 도입되었습니다. 기본적으로 아직 완료되지 않은 작업의 결과에 대한 자리 표시 자입니다. 작업이 완료되면에 Future해당 결과가 포함됩니다. 예를 들어 작업은 ExecutorService에 제출 된 Runnable 또는 Callable 인스턴스 일 수 있습니다 . 오퍼레이션 제출자는 오브젝트를 사용하여 오퍼레이션이 isDone () 인지 여부를 확인 하거나 블로킹 get () 메소드를 사용하여 완료 될 때까지 기다릴 있습니다.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

CompletableFutures 는 Java 8 (2014)에 도입되었습니다. 그것들은 사실 구아바 도서관의 일부인 구글의 리스너 러블 퓨처스 ( Google의 Listenable Futures) 에서 영감을 얻은 정기 선물의 진화입니다 . 그것들은 또한 당신이 체인으로 작업을 묶을 수있는 선물입니다. 그것들을 사용하여 일부 작업자 스레드에게 “일부 작업 X를 수행하고 완료되면 X 결과를 사용하여 다른 작업을 수행하십시오”라고 지시 할 수 있습니다. CompletableFutures를 사용하면 결과를 기다리는 스레드를 실제로 차단하지 않고도 작업 결과로 무언가를 수행 할 수 있습니다. 다음은 간단한 예입니다.

/**
* 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의 스트림 과 비슷한 것으로 보입니다 . 그것은 훨씬 더 강력하다는 것을 제외하고는입니다.

선물과 마찬가지로 RxJava를 사용하여 여러 개의 동기식 또는 비동기식 작업을 함께 처리하여 처리 파이프 라인을 만들 수 있습니다. 일회용 인 Futures와 달리 RxJava 는 0 개 이상의 항목 스트림 에서 작동 합니다. 무한한 수의 항목으로 끝나지 않는 스트림 포함. 믿을 수 없을만큼 풍부한 연산자 세트 덕분에 훨씬 유연하고 강력 합니다.

Java 8의 스트림과 달리 RxJava에는 역압 메커니즘이있어 처리 파이프 라인의 다른 부분이 다른 스레드 에서 다른 속도로 작동하는 경우를 처리 할 수 있습니다 .

RxJava의 단점은 탄탄한 문서에도 불구하고 관련된 패러다임 전환으로 인해 배우기 어려운 라이브러리라는 것입니다. Rx 코드는 특히 여러 스레드가 관련되어 있고 더 심한 경우 역압이 필요한 경우 디버깅하기에 악몽이 될 수 있습니다.

그것에 들어가고 싶다면 공식 웹 사이트와 공식 문서Javadoc 에 대한 다양한 자습서 의 전체 페이지 가 있습니다. Rx에 대한 간략한 소개를 제공하고 Rx와 미래의 차이점에 대해 이야기하는 비디오와 같은 일부 비디오를 살펴볼 수도 있습니다 .

보너스 : Java 9 반응성 스트림

Java 9의 Reactive Streams 일명 Flow APIRxJava 2 , Akka StreamsVertx 와 같은 다양한 반응성 스트림 라이브러리로 구현되는 인터페이스 세트입니다 . 이것들은 모든 반응성 배압을 유지하면서 이러한 반응성 라이브러리가 상호 연결되도록합니다.


답변

0.9부터 Rx Java를 사용하여 현재 1.3.2에서 곧 2.x로 마이그레이션하고 있으며 이미 8 년 동안 작업 한 개인 프로젝트에서이를 사용합니다.

이 라이브러리 없이는 더 이상 프로그래밍하지 않을 것입니다. 처음에는 회의적 이었지만, 당신이 만들어야 할 완전히 다른 상태입니다. 처음에는 조용히 어렵다. 나는 때때로 몇 시간 동안 구슬을보고 있었다 .. lol

그것은 단지 연습의 문제이며 실제로 흐름 (일명 관찰자와 계약자 계약)을 알게되면, 일단 거기에 도착하면 그렇지 않으면 싫어합니다.

저에게 그 도서관에는 실제로 단점이 없습니다.

유스 케이스 : 9 게이지 (cpu, mem, network 등)가 포함 된 모니터보기가 있습니다. 뷰를 시작할 때 뷰는 9 미터에 대한 모든 데이터를 포함하는 관찰 가능 (간격)을 리턴하는 시스템 모니터 클래스를 구독합니다. 매 초마다 새로운 결과를 뷰에 푸시합니다 (따라서 폴링하지 않습니다 !!!). 이 Observable은 플랫 맵을 사용하여 9 개의 다른 소스에서 동시에 데이터를 가져오고 결과를 onNext ()에서 얻을 수있는 새 모델로 압축합니다.

도대체 선물, 컴 포터블 등으로 어떻게 할 건가요? 행운을 빌어 요! 🙂

Rx Java는 저를위한 프로그래밍의 많은 문제를 해결하고 훨씬 쉬운 방법으로 만듭니다 …

장점 :

  • Statelss !!! (가장 중요한 것, 가장 중요한 것)
  • 즉시 사용 가능한 스레드 관리
  • 자체 수명주기가있는 시퀀스 구축
  • 모든 것이 관찰 가능하므로 체인 연결이 쉽습니다.
  • 적은 코드 작성
  • 클래스 패스의 단일 병 (매우 가벼운)
  • 매우 동시
  • 더 이상 콜백 지옥 없음
  • 가입자 기반 (소비자와 생산자 간의 긴밀한 계약)
  • 배압 전략 (회로 차단기 등)
  • 화려한 오류 처리 및 복구
  • 아주 좋은 문서 (대리석 <3)
  • 완벽한 제어
  • 더 많은 …

단점 :-테스트하기 어렵다


답변