리액티브 프로그래밍 컨셉의 기초
업데이트:
Future
-비동기 계산을 모델링 하며 Future는 계산이 끝날을때 결과에 접근할 수 있는 참조를 제공한다.
- 오래걸리는 작업일 경우 Future 내부로 설정하면 스레드가 결과를 기다리는 동안 다른 유용한 작업을 수행할 수 있다.
기본 Future
Future<Integer> y = f(x);
Future<Integer> z = g(x);
System.out.println(y.get() + z.get())
메서드 f는 호출 즉시 자신의 원래 바디를 평가하는 태스크를 포함하는 Future를 반환한다. 마찬가지로 g도 Future를 반환하며 세 번째 코드는 get() 메서드를 이용해 두 Future가 완료되어 결과가 합쳐지기를 기다린다.
CompletableFuture와 콤비네티어를 이용한 동시성
자바 8에는 Future 인터페이스의 구현인 CompletableFuture를 이용해 Future를 조합할 수 있는 기능을 추가했다.
thenCombine
- 이 메서드는 두개의 CompletableFuture값을 받아 한개의 새 값을 만든다.
CompletableFuture<V> thenComvine(CompletableFuture<U> other,
BIFunction<T,U,V>fn)
ExecutorService executorService = Executors.newFixedThreadPool(10);
int x = 1337;
CompletableFuture<Integer> a = new CompletableFuture<>();
CompletableFuture<Integer> b = new CompletableFuture<>();
CompletableFuture<Integer> c = a.thenCombine(b, (y, z) + y + z);
executorService.submit(() -> a.complete(f(x)));
executorService.submit(() -> b.complete(g(x)));
print(c.get());
executorService.shutdown();
thenCombine이 행의 핵심으로 a, b의 결과를 알지 못한 상태에서 두 연산이 끝났을때 실행된 연산을 만든다.
발행-구독 그리고 리액티브 브로그래밍
발행-구독 모델
- 구독자가 구독할 수 있는 발행자
- 이 연결을 구독이라 한다.
- 이 연결을 이용해 메시지(또는 이벤트)를 전송한다.
**Publisher
- 발행자(생산자)로 데이터를 생산한다.
- 소비자가 등록될 때까지는 아무일도 일어나지 않는다.
interface Publisher<T>{
// 구독자 등록
void subscribe(Subscriber<? super T> subscriber);
}
Operator
- 체인 연산자로 연산을 통해새 로운 생상자를 반환한다.
Subscriber
- 구독자(소비자)로 데이터를 소비한다
interfaceSubscriber<T>{
// 정보를 전달할 단순 메서드를 포함하며 구현자가 필요한데로 구현 가능
void onNext(T t);
}
데이터가 발행자(생성자)에서 구독자(소비자)로 흐름에 착안해 개발자는 이를 업스트림 또는 다운스트림이라 한다.
역압력
- Subscriber 에서 Publisher로 정보 요청이 필요 할때 사용
- Subscription을 통해 역방향으로 소통할 수 있다.
interface Subscription{
void cancel();
void request(long) n;
}
댓글남기기