Search

Item 80. 스레드보다는 실행자, 태스크, 스트림을 애용하라

생성일
2023/08/19 02:39
챕터
11장 -동시성

요약

Thread를 직접 사용하기보다 실행자(Executor)와 태스크(Runnable, Callable)를 사용하자.

실행자(Executor)

java.utill.concurrent 패키지에는 실행자 프레임워크(Executor Framework)가 추가되어, 인터페이스 기반의 유연한 태스크 실행이 가능해졌다.
ExecutorService exec = Excutor.newSingleThreadExecutor(); exec.execute(runnable); exec.shutdown();
Java
복사
위와 같이 실행자에 실행할 태스크(Task)를 넘겨 스레드에서 실행 시킬 수 있다.
이외에도 정말 많은 기능들을 제공하고 있다.
특정 태스크가 완료되기를 기다리기(get)
태스크 모음 중 가장 빨리 끝나는 아무거나 기다리기(invokeAny) 혹은 모든 태스크가 끝나길 기다리기(invokeAll)
실행자가 종료되기를 기다리기(awaitTermination)
실행자를 통하면 스레드 풀을 통해 스레드를 관리할 수 있고, 해당 인터페이스를 구현한 여러 구현 클래스들을 가져다가 사용하여, 애플리케이션의 특성에 맞는 적절한 환경을 구성할 수 있다.
스레드를 직접 다루거나 작업 큐를 손수 만드는 일은 피해야 한다. 스레드를 직접 다루면 Thread 클래스에서 작업 단위와 수행 메커니즘 역할을 모두 수행하는데, 실행자 프레임워크에서는 작업 단위와 수행 메커니즘 역할이 분리된다.
Runnable과 Callable을 통해 실행자 서비스에 태스크를 전달하여, 실행자 프레임워크가 작업 수행을 담당하도록 할 수 있다.
자바 7부터는 포크-조인(fork-join) 태스크를 지원하기 때문에, ForkJoinTask를 만들어 작은 하위 태스크를 나누고 ForkJoinPool로 스레드들을 관리하게 만들 수 있다.
이렇게 실행자와 태스크를 통해 모든 스레드가 바쁘게 동작하여 CPU 활용률을 높이고 높은 처리량과 낮은 지연 시간을 만들자.