티스토리 뷰
반응형
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]을 이용하면 쉽게 다루면서 이점을 얻을 수 있음
반응형
'Java > Effective Java' 카테고리의 다른 글
[Effective Java] 82.스레드 안전성 수준을 문서화하라 (0) | 2022.05.08 |
---|---|
[Effective Java] 81.wait와 notify보다는 동시성 유틸리티를 사용하라 (0) | 2022.04.19 |
[Effective Java] 79.과도한 동기화는 피하라 (0) | 2022.04.19 |
[Effective Java] 78.공유 중인 가변 데이터는 동기화해 사용하라 (0) | 2022.04.19 |
[Effective Java] 77.예외를 무시하지 말라 (0) | 2022.04.16 |
댓글