리액티브 프로그래밍 컨셉의 기초

업데이트:

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;
}

댓글남기기