사내 세미나 과제 피드백 CH10 - Future, ComputableFuture

이동욱

2021/03/13

Categories: 프로그래밍 - 자바 Tags: 자바

회사에서 자바 비동기 처리 및 Future, CompletableFuture에 대해서 세미나를 진행하였다.

과제를 진행하면서, 비동기 프로그래밍 및 자바에서 비동기 프로그래밍을 어떻게 사용하는지 생각해 볼 수 있었다.

Screen Shot 2021-03-13 at 11 50 40 AM

친절하게 피드백을 해주셨기 때문에, 내가 ComputableFuture를 잘못사용하고 있다는 사실을 알게 되었다.

repository.retrieveCategories().parallelStream()
                .map(category -> CompletableFuture.supplyAsync(() -> repository.retrieveBooksByCategory(category)))
                .collect(Collectors.toList())
        .parallelStream()
        .map(CompletableFuture::join)     // (1)
        .flatMap(Collection::parallelStream)
        .collect(Collectors.toList())
        .parallelStream()
        .map(book -> CompletableFuture.runAsync(() -> repository.updateAuthor(book, author), executors))
        .collect(Collectors.toList())
        .forEach(CompletableFuture::join); // (2)
        executors.shutdown();

위의 코드는 내가 처음에 제출한 코드이다. 문제점을 보면 다음과 같다.

따라서 피드백을 받은 부분을 개선한 결과는 다음과 같다.

final List<CompletableFuture<List<Book>>> futures
            = repository.retrieveCategories().stream()
            .map(category -> supplyAsync(() -> repository.retrieveBooksByCategory(category), executors))
            .collect(toList());

        final List<CompletableFuture<Void>> updateFutures
            = futures.stream()
            .map(future -> future.thenCompose(books -> allOf(
                books.stream()
                    .map(book -> runAsync(() -> repository.updateAuthor(book, author), executors))
                    .toArray(CompletableFuture[]::new)
            )))
            .collect(toList());
        updateFutures.forEach(CompletableFuture::join);

참고 문헌

>> Home