티스토리 뷰

반응형

java.util.concurrent

아이템 49에서 백그라운드 스레드에 위임해 비동기적으로 작업을 요청해 처리하는 작업 큐를 생성해 사용했었다.

이제는 직접 사용자가 작업 큐를 작성하지 않고 java.util.concurrent 패키지를 사용하면 된다.

실행자 프레임워크라고 하는 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있다.

ExecutorService exec = Executors.newSingleThreadExecutor();  //실행자 생성

exec.execute(runnable);  //실행 할 태스크를 넘기는 방법

exec.shutdown();  //실행자를 종료시키는 방법

ExecutorService(실행자 서비스)의 주요 기능들

  • 큐에 작업을 제출하고서 작업이 완료될 때까지 기다릴 수 있다.(invokeAny, invokeAll 메서드)
  • 큐가 종료되기를 기다릴 수 있다.(awaitTermination 메서드)
  • 하나의 작업이 끝날때 마다 작업의 결과를 가져올 수 있다.(ExecutorCompleteService)
  • 작업을 특정 주기나 시간에 맞춰 동작할 수 있다.(ScheduledThreadPoolExecutor)

 

큐를 둘 이상의 스레드가 처리하게 하고 싶을 때

  • 다른 정적 팩터리를 이용하여 다른 종류의 실행자 서비스(스레드 풀) 생성
    • java.util.concurrent.Executors 의 정적 팩터리들 이용
    • ThreadPollExecutor 클래스 직접 사용 → 스레드 풀 동작을 결정하는 거의 모든 속성 설정 가능
  • 규모가 작은 프로그램이면 Executors.newCachedThreadPool 사용 추천
  • 규모가 큰 프로그램이면 Executors.newFixedThreadPool 이나 ThreadPoolExecutor 직접 사용 추천

 

작업 큐를 손수 만들거나 스레드를 직접 다루는 것은 삼가자.

스레드를 직접 다루면 작업 단위와 수행 메커니즘 역할을 모두 수행 → but 실행자 프레임워크는 역할이 분리됨

 

 

작업(task)

  • 종류 : Runnable, Callable
  • 실행자 서비스 : 작업을 수행하는 일반적인 메커니즘 (원하는 태스크 수행 정책 선택 가능)
  • 자바 7의 실행자 프레임워크는 포크-조인(fork-join) 태스크 지원하도록 확장
    • 포크-조인 태스크는 포크-조인 풀이라는 실행자 서비스가 실행
    • 포크-조인 태스크는 작업을 세부 작업으로 나누고, 포크-조인 풀을 구성하는 스레드들이 이 작업을 처리하며 스레드가 쉬지않고 일할 수 있도록 다른 스레드의 남은 작업을 대신 처리할 수 있다. → 높은 처리량과 낮은 지연시간 달성
    • 포크-조인 풀을 이용해 만든 병렬 스트림 [아이템 48]을 이용하면 쉽게 다루면서 이점을 얻을 수 있음
반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday