요약
•
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 활용률을 높이고 높은 처리량과 낮은 지연 시간을 만들자.