ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [책 정리]Modern Java In Action 15장
    책정리/Modern Java In Action 2020. 6. 17. 00:44

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

    • Thread, Future, 자바가 풍부한 동시성 API를 제공하도록 강요하는 진화의 힘
    • 비동기 API
    • 동시 컴퓨팅의 박스와 채널 뷰
    • CompletableFuture 콤비네이터로 박스를 동적으로 연결
    • 리액티브 프로그래밍용 자바 9플로 API의 기초를 이루는 발행 구독 프로토콜
    • 리액티브 프로그래밍과 리액티브 시스템

    15.1 동시성을 구현하는 자바 지원의 진화

    멀티코어 CPI에서 효과적으로 프로그래밍을 실행할 필요성이 커지면서 이후 자바 버젼에서는 개선된 동시성 지원이 추가됨.

    자바는 Future를 조합하는 기능을 추가하면서 동시성을 강화

     

    15.1.2 Executor와 스레드 풀

    자바5는 Executor 프레임워크와 스레드 풀을 통해 스레드의 힘을 높은 수준으로 끌어올리는 즉 자바 프로그래머가 태스크 제출과 실행을 분리할 수 있는 기능 제공.

     

    스레드의 문제

    자바 스레드는 직접 운영체제 스레드에 접근한다. 운영체제가 지원하는 스레드 수를 초과해 사용하면 자바 애플리케이션이 예상치 못한 방식으로 크래시될 수 있으므르 기존스레드가 실행되는 상태에서 계속 새로운 스레드를 만드는 상황이 일어나지 않도록 주의해야 한다.

     

    스레드 풀 그리고 스레드 풀이 더 좋은이유

    자바 ExecutorService 는 태스크를 제출하고 나중에 결과를 수집할 수 있는 인터페이스를 제공한다.

    워커스레드라 불리는 nThreads를 포함하는 ExecutorService 를 만들고 이들을 스레드 풀에 저장한다. 스레드 풀에서 사용하지 않은 스레드로 제출된 태스크를 먼저 온 순서대로 실행한다. 태스크 실행이 종료되면 이들 스레드를 풀로 반환한다.

    장점은 하드웨어에 맞는 수의 태스크를 유지함과 동시에 수 천개의 태스크를 스레드 풀에 아무 오버헤드 없이 제출할 수 있다.

    태스크(Runnable 이나 Callable) 를 제공하면 스레드가 이를 실행

     

    스레드 풀 그리고 스레드 풀이 나쁜 이유

    잠을 자거나 I/O를 기다리거나 네트워크 연결을 기다리는 태스크가 있다면 주의.

    블록(자거나 이벤트를 기다리는)할 수 있는 태스크는 스레드 풀에 제출하지 말아야 한다.

     

    15.1.3 스레드의 다른 추상화 : 중첩되지 않은 메서드 호출

    • 스레드 실행은 메서드를 호출한 다음의 코드와 동시에 실행되므로 데이터 경쟁 문제를 일으키지 않도록 주의해야한다.
    • 기존 실행 중이던 스레드가 종료되지 않은 상황에서 자바의 main() 메서드가 반환하면 

        - 애플리케이션을 종료하지 못하고 모든 스레드가 실행을 끝낼 때까지 기다린다.

        - 애플리케이션 종료를 방해하는 스레드를 강제종료 시키고 애플리케이션을 종료한다.

     

    15.2 동기 API와 비동기 API

    자바 5의 Future는 자바 8의 CompletableFuture로 이들을 조합하여 비동기 구현 가능

     

    15.2.3 잠자기 는 해로운것으로 간주

    10초 동안 워커 스레드를 점유한 상태에서 아무것도 안하는 코드

    work1();
    Thread.sleep(1000);
    work2();

    다른 작업이 실행될 수 있도록 허용하는 코드(스레드를 사용할 필요가 없이 메모리만 조금 더 사용)

    work1();
    scheduledExecutorService.schedule(ScheduledExecutorServiceExample::work2, 10, TimeUnit.SECONDS);

    태스크가 실행되면 귀중한 자원을 점유하므로 태스크가 끝나서 자원을 해제하기 전까지 태스크를 계속 실행해야 한다.

    태스크를 블록하는 것보다는 다음 작업을 태스크로 제출하고 현재 태스크는 종료하는 것이 바람직.

    반응형

    댓글

Designed by Tistory.