Completable의 차이점미래, 미래 및 RxJava의 관측 가능
가 있는지 요.CompletableFuture ,Future ★★★★★★★★★★★★★★★★★」Observable RxJava.
제가 아는 건 다 비동기인데
Future.get()를
CompletableFuture.
RxJava ObservableCompletableFuture★★★★★★★★★★★★★★★☆
들어 가 여러 콜을 가 있는 및 가 를 사용하는 Futures (자바)Future.get() 의 장점을 알고 싶다.RxJava rx 、 RxJava 、 RxJava 。
문서 http://reactivex.io/intro.html에 기재되어 있습니다.
Futures를 사용하여 조건부 비동기 실행 흐름을 최적으로 구성하는 것은 어렵습니다(또는 각 요청의 지연 시간이 런타임에 따라 다르기 때문에 불가능).이것은 물론 가능합니다만, 순식간에 복잡해지거나(그리고 에러가 발생하기 쉬운), 또는 Future.get()을 조기에 차단하기 때문에, 비동기 실행의 메리트가 없어집니다.
방법을 알고 싶습니다.RxJava을 사용하다나는 그 서류를 보고 이해하기 어려웠다.
선물
선물은 Java 5(2004)에서 도입되었습니다.기본적으로 아직 완료되지 않은 작업의 결과를 나타내는 자리 표시자입니다.작업이 완료되면Future그 결과가 포함됩니다.예를 들어 ExecutorService에 제출된 실행 가능 인스턴스 또는 호출 가능 인스턴스일 수 있습니다.조작의 송신자는,Future오브젝트는 동작이 Done()인지 확인하거나 blocking 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
}
컴플리트선물
컴플리트선물은 Java 8(2014)에서 도입되었습니다.사실 구글의 '듣기 쉬운 미래'에서 영감을 얻어 일반 미래로 진화한 것입니다.Guava 라이브러리의 일부입니다.또한 작업을 체인으로 묶을 수 있는 Futures입니다.작업자 스레드에 "일부 태스크 X를 실행하고, 끝나면 다른 태스크 X의 결과를 사용하여 실행"을 지시하기 위해 사용할 수 있습니다.Complete table 사용방법미래에서는 결과를 기다리는 스레드를 실제로 차단하지 않고 작업 결과에 대해 작업을 수행할 수 있습니다.다음은 간단한 예입니다.
/**
* 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를 사용하여 동기 또는 비동기 액션의 묶음을 조합하여 처리 파이프라인을 작성할 수 있습니다.일회용인 Futures와 달리 RxJava는 0개 이상의 항목 스트림에서 작동합니다.끝없는 스트림과 무한한 수의 항목을 포함합니다.또한 믿을 수 없을 정도로 풍부한 오퍼레이터 덕분에 훨씬 유연하고 강력해졌습니다.
Java 8의 스트림과 달리 RxJava는 또한 백프레셔 메커니즘을 가지고 있으며 이를 통해 처리 파이프라인의 다른 부분이 다른 스레드로 다른 속도로 동작하는 경우를 처리할 수 있습니다.
RxJava의 단점은 견고한 문서에도 불구하고 패러다임의 변화로 인해 학습하기 어려운 라이브러리라는 점입니다.Rx 코드는 특히 여러 스레드가 관련되어 있는 경우, 그리고 백프레셔가 필요한 경우 디버깅하는 데 악몽이 될 수 있습니다.
자세한 내용은 공식 웹사이트에 다양한 튜토리얼과 공식 문서 및 Javadoc 페이지가 있습니다.Rx에 대한 간략한 소개와 Rx와 Futures의 차이점을 소개하는 이 비디오도 볼 수 있습니다.
보너스: Java 9 리액티브 스트림
Java 9의 Reactive Streams 일명 Flow API는 RxJava 2, Aka Streams 및 Vertx와 같은 다양한 Reactive Streams 라이브러리에 의해 구현된 인터페이스 세트입니다.이러한 반응형 라이브러리를 상호 연결하여 모든 중요한 배압을 유지할 수 있습니다.
0.9부터 Rx Java를 사용하고 있으며, 현재는 1.3.2로 이행하고 있으며, 곧 2.x로 이행하여 이미 8년간 작업하고 있는 개인 프로젝트에서 사용하고 있습니다.
이 도서관이 없었다면 프로그램을 전혀 하지 않았을 거예요.처음에 나는 회의적이었지만 그것은 당신이 만들어야 할 완전히 다른 심리상태이다.처음에는 좀 어려웠어요.가끔 구슬을 몇 시간씩 쳐다보곤 했어요ㅋㅋㅋ
그것은 단지 연습의 문제일 뿐이고 실제로 흐름을 알아가는 것(일명 관측 가능성과 관찰자의 계약)입니다. 일단 그곳에 도착하면, 당신은 그것을 달리 하는 것을 싫어하게 될 것입니다.
나에게 그 도서관은 별로 나쁜 점이 없다.
사용 사례:9개의 게이지(cpu, mem, network 등)가 포함된 모니터 뷰가 있습니다.보기를 시작할 때 보기가 시스템 모니터 클래스에 등록되고 시스템 모니터 클래스는 9m의 모든 데이터를 포함하는 관찰 가능(간격)을 반환합니다.그러면 매초 새로운 결과가 뷰에 푸시됩니다(따라서 폴링하지 마십시오).이 관찰 가능은 플랫맵을 사용하여 9개의 다른 소스에서 동시에 데이터를 가져오고(비동기!) 결과를 onNext()에서 볼 수 있는 새 모델로 압축합니다.
미래나 완성도 같은 걸로 대체 어떻게 할 건데?행운을 빈다 :)
Rx Java는 프로그래밍에 관한 많은 문제를 해결해주고 훨씬 쉽게 만들어줍니다.
장점:
- 스테이트리스!!!(중요한 언급, 아마도 가장 중요한 것)
- 즉시 사용 가능한 스레드 관리
- 독자적인 라이프 사이클을 가지는 시퀀스를 작성하다
- 모든 것이 관찰 가능하기 때문에 체인이 쉽다.
- 쓸 코드 감소
- 클래스 패스에 1개의 항아리(초경량)
- 높은 동시성
- 더 이상 콜백 지옥은 없다.
- 가입자 기반(소비자와 생산자 간의 긴밀한 계약)
- 배압 전략(회로 차단기 등)
- 뛰어난 오류 처리 및 복구
- 매우 훌륭한 문서(마블스 <3)
- 완전한 제어
- 더 많이...
결점: - 테스트하기 어려움
3개의 인터페이스 모두 생산자에서 소비자에게 값을 전송하는 역할을 합니다.컨슈머는 2가지 종류가 있습니다.
- synchronous: 사용자가 블로킹콜을 발신하여 값이 준비되면 반환한다.
- asynchronous: 값이 준비되면 사용자의 콜백 방식이 호출됩니다.
또, 통신 인터페이스는 다른 방법으로 다릅니다.
- 여러 값의 단일 값을 전송할 수 있는
- 값이 여러 개일 경우 배압을 지원할 수 있는지 여부
그 결과:
Future는 동기 합니다.CompletableFuture인터페이스와 를 모두 합니다.Rx는 back 를 가진 를 사용하여 여러 합니다.
또, 이러한 모든 통신 설비는, 예외의 전송을 서포트합니다.항상 그렇지만은 않다.를 들어, 「」라고 하는 것은,BlockingQueue지지않않않않
의 ★★★Future는 블로킹 API로 향후 완료될 무언가를 보유하기 위한 플레이스 홀더입니다.'어울리지 않다'를 해야 합니다isDone()정기적으로 폴링하여 작업이 완료되었는지 여부를 확인하는 메서드입니다.독자적인 비동기 코드를 실장하고, 폴링 로직을 관리할 수 있습니다.단, 보일러 플레이트코드와 디버깅오버헤드가 증가합니다.
자바어CompletableFutureScala's Future에 의해 혁신되었습니다.내부 콜백 방식을 전송합니다.완료되면 콜백 메서드가 트리거되어 다운스트림 조작을 실행할 필요가 있음을 스레드에 알립니다.그래서...thenApply로 둘러싸인 오브젝트에 대해 추가 작업을 수행하는 방법CompletableFuture.
RxJava의Observable의 확장 버전입니다.CompletableFuture배압을 견딜 수 있게 해줍니다.에서thenApply(그리고 그 형제들과도) 방법thenApplyAsync위에서 설명한 바와 같이 이 상황이 발생할 수 있습니다.다운스트림 방식은 경우에 따라서는 사용할 수 없게 되는 외부 서비스를 호출하려고 합니다.이 경우,CompleteableFuture완전히 실패하기 때문에, 스스로 에러를 해결할 필요가 있습니다.하지만,Observable그럼 외부 서비스를 사용할 수 있게 되면 배압을 처리하고 실행을 계속할 수 있습니다.
또, 같은 인터페이스도 있습니다.Observable:Flowable다른 목적으로 설계되어 있습니다.보통Flowable는 콜드 및 비콜드 작업을 처리하는 데 전념하고 있습니다.Observable는 즉각적인 응답이 필요한 실행을 처리하는 데 전념합니다.다음 공식 문서를 참조하십시오.https://github.com/ReactiveX/RxJava#backpressure
Completable의 주요 장점통상적인 미래를 뛰어넘는 미래가 완성됩니다.Future는 매우 강력한 스트림 API를 이용하여 콜백핸들러를 통해 태스크를 체인으로 만들 수 있습니다.일반 Future를 사용하는 경우에는 이 기능이 전혀 없습니다.비동기 아키텍처와 함께 Completetable을 제공합니다.애플리케이션 성능에 대해 크게 걱정하지 않고 계산 부하가 높은 맵 축소 작업을 처리하는 것이 미래입니다.
언급URL : https://stackoverflow.com/questions/35329845/difference-between-completablefuture-future-and-rxjavas-observable
'programing' 카테고리의 다른 글
| ctime()에 의해 반환된 문자열에 줄바꿈이 포함되어 있는 이유는 무엇입니까? (0) | 2022.07.14 |
|---|---|
| 메서드 반환 유형을 범용으로 만들려면 어떻게 해야 합니까? (0) | 2022.07.14 |
| RouteUpdate 이전 vue-router가 전환 시 이전 매개 변수를 사용함 (0) | 2022.07.12 |
| 주의: 어레이 첨자에 char 유형이 있습니다. (0) | 2022.07.12 |
| Vue SSR/Episerver 솔루션에서의 코드 분할 (0) | 2022.07.12 |