💡 이 장의 내용
- 비동기 작업을 만들고 결과 얻기
- 비블록 동작으로 생산성 높이기
- 비동기 API 설계와 구현
- 동기 API를 비동기적으로 소비하기
- 두 개 이상의 비동기 연산을 파이프라인으로 만들고 합치기
- 비동기 작업 완료에 대응하기
Java 5부터는 미래의 어느 시점에 결과를 얻는 모델에 활용할 수 있으며, Future를 제공한다.
비동기 계산을 모델링하는 데 Future를 이용할 수 있으며, 계산이 끝났을 때 결과에 접근할 수 있는 참조를 제공한다.
Future를 이용하려면 시간이 오래 걸리는 작업을 Callable 객체 내부로 감싼 다음, ExecutorService에 제출해야 한다!
Java 8 이전 코드
ExecutorService executor = Executors.newCachedThreadPool();
Future<Double> future = executor.submit(new Callable<Double>() {
public Double call() {
return doSomeLongComputation(); //시간이 오래 걸리는 작업 -> 비동기 실행
}});
doSomethingElse(); //비동기 작업을 수행하는 동안 다른 작업
try {
Double result = future.get(1, TimeUnit.SECONDS);
//비동기 작업의 결과를 가져옴. 결과가 준비되어 있지 않으면 호출한 스레드가 1초간 블록됨
} catch (ExecutionException ee) {
// the computation threw an exception
} catch (InterruptedException ie) {
// the current thread was interrupted while waiting
} catch (TimeoutException te) {
// the timeout expired before the Future completion
}
그림으로 보는 시나리오
오래 걸리는 작업이 영원히 끝나지 않는다면 어떻게 될까?
생각해보기!