Item 80 : 스레드보다는 실행자, 태스크, 스트림을 애용하라.
2021. 9. 17. 18:06
이번 챕터는 스레드를 대신할 수 있는 수단에 대해 설명하는데 설명자, 태스크가 정확히 와닿지 않아서 먼저 정리해본다.
- 설명자는 ExecutorService는 병렬작업 시 여러개의 작업을 효율적으로 처리하기 위해 제공되는 java 라이브러리다.
- 보통은 threadpool을 만들어서 쓰레드를 관리해줘야 하지만 설명자로 쉽게 처리가 가능하다.
- 외부에서 쓰레드를 생성하는 메소드를 호출한다면 ExecutorService는 스스로 생명주기 관리를 해준다.
- java.util.concurrent 라는 패키지는 실행자 프레임워크 (Executor Framework)라고 하는 인터페이스 기반의 유연한
- 태스크 실행 기능을 담고 있다.
- 작업 큐를 다음의 단 한줄로 생성이 가능하다.
// 실행자 생성
ExecutorService exec = Executors.newSingleThreadExecutor();
// task 넘기기
exec.execute(runnable);
// 실행자 종료
exec.shutdown();
실행자의 주요 기능
- 특정 태스크가 완료되기를 기다린다.
- 태스크 모음 중 아무것 하나 혹은 모든 태스크가 완료되기를 기다린다.
- invokeAny , invokeAll
- 실행자 서비스가 종료하기를 기다린다.
- awaitTermination
- 완료된 태스크들의 결과를 차례로 받는다.
- ExecutorCompletionService
- 태스크를 특정 시간에 혹은 주기적으로 실행하게 한다.
- ScheduledThreadPoolExecutor
- 큐를 둘 이상의 스레드가 처리하게 하고 싶다면 간단히 다른 정적 팩터리를 이용하여 달느 종류의 실행자 서비스(스레드 풀)를 생성하면 된다.
- java.util.concurrent.Executors의 정적 팩터리를 이용해 스레드풀을 만들거나 ThreadPoolExecutor 클래스를 직접 사용할 수도 있다.
- 작업 큐를 손수 만드는 일은 삼가해야 하며 스레드를 직접 다루는 것도 삼가야 한다.
- 스레드를 직접 다루면 생명주기를 일일이 관리해줘야하기 때문에 작업량이 많아진다.
작업 단위를 나타내는 핵심 추상개념이 태스크다.
- 태스크에는 두가지가 있다.
- Runnable
- Callable
- Callable은 Runnable과 비슷하지만 값을 반환하고 임의의 예외를 던질 수 있음
- 이런 태스크를 수행하는 일반적인 메커니즘이 바로 실행자 서비스이다.
- 이런 태스크의 수행을 실행자 서비스에 맡기면 원하는 태스크 수행 정책을 선택할 수 있고 생각이 바뀌면 언제든 변경 가능하다.
'책 > 이펙티브자바' 카테고리의 다른 글
Item 82 : 스레드 안전성 수준을 문서화하라 (0) | 2021.09.19 |
---|---|
Item 81 : wait와 notify보다는 동시성 유틸리티를 애용하라 (0) | 2021.09.19 |
Item 79 : 과도한 동기화는 피하라 (0) | 2021.09.16 |
Item 78 : 공유 중인 가변 데이터는 동기화해 사용하라 (0) | 2021.09.15 |
Item 77 : 예외를 무시하지 말라 (0) | 2021.09.13 |