스트림을 이용해 스레드 사용 패턴을 추상화할 수 있다
스트림을 사용하면 복잡성도 줄어든다
스레드의 힘을 높은 수준으로 끌어올렸다
스레드의 문제
스레드 풀
장점
단점
엄격한 포크/조인: 스레드 생성과 join()이 한 쌍처럼 중첩된 메서드 호출 내에 추가
여유로운 포크/조인: 태스크를 외부 호출해서 종료하도록 기다리는 방식
비동기 메서드: 사용자의 메서드 호출에 의해 스레드가 생성되고 메서드를 벗어나 계속 실행되는 동시성 형태
비동기 사용시 주의 사항
프로그램을 작은 태스크 단위로 구조화해 병렬성의 장점을 극대화 하는것이 목표다
Future<Integer> y = f(x);
Future<Integer> z = g(x);
System.out.println(y.get() + z.get());
void f(int x, IntConsumer dealWithResult);
결과가 준비되면 람다로 호출하는 태스크를 만든다
스레드는 잠들어도 여전히 시스템 자원을 점유 → 다른 태스크가 시작되지 못하게 막는다
태스크에서 기다리는 일을 만들지 말거나 예외를 일으키는 방법으로 처리
비동기 API에서 호출된 메서드의 실제 바디는 별도의 스레드에서 호출
값이 있을때(onNext), 에러 발생(onError), 값을 소진했거나 에러가 발생해서 더이상 처리할 데이터가 없을 때(onComplete)시 콜백이 호출
이런 종류의 호출을 메시지 혹은 이벤트라 부른다
CompletableFuture: 실행할 코드 없이 Future을 만들 수 있도록 허용하며 complete() 메서드를 이용해 나중에 어떤 값을 이용해 다른 스레드가 이를 완료할 수 있고 get()으로 갑을 얻을 수 있도록 허용
thenCombine 메서드를 사용함으로 Future 연산들이 끝났을 때 스레드 풀에서 실행된 연산을 만든다→ get을 사용하지 않아 스레드 블락을 막고 병렬 실행의 효율성 높이고 데드락을 피할 수 있다
Future: 한 번만 실행해 결과를 제공하는 정석적 모델
리액티브 프로그래밍: 여러 Future같은 객체를 통해 여러 결과를 제공
자바에서 리액티브 프로그래밍을 위해 발행-구독 모델을 지원
발행-구독 모델
정보의 흐름 속도를 조절하는 것
다음 사항들을 고려해야 됨
당김 기반 리액티브 압력: Subscriber가 Publisher로 부터 요청을 당기는 방식인데 이렇게 억압력을 구현할 수 도 있다
리액티브 시스템
리엑티브 프로그래밍 형식을 이용해 이 특성들을 구현할 수 있다
리엑티브 프로그래밍은 메시지 주도 속성을 반영
메시지 주도 속성: 컴포넌트는 처리할 입력을 기다리고 결과를 다른 컴포넌트로 보내면서 시스템이 반응