자바 1.5부터 자바 플랫폼에는 java.util.concurrent가 추가되었다. 이 패키지에는 실행자 프레임워크 라는 것이 들어 있는데, 요연성이 높은 인터페이스 기반 태스크 실행 프레임워크다. 이 프렘워크를 사용하면 스레드를 직접 관리하는 작업 큐를 한 줄의 코드로 생성할 수 있다.
실행자가 스스로 자연스럽게 종료되도록 하려면 다음과 같이 하면 된다.
실행자 태스크를 이용하면 할 수 있는 것이 많다.
- 특정 태스크가 종료되기를 대기
- 임의의 태스크들이 종료되기를 대기
- 실행자 서비스가 자연스럽게 종료되기를 기다릴 수 도 있음.
- 태스크가 끝날때 마다 결과값을 차례로 가져옴.
작은 프로그램이거나 부하가 크지 않은 서버를 만들 때는 보통 Executors.newCashedThreadPool을 사용한다. 설정이 필요 없고, 보통 많은 일을 잘 처리하기 때문이다. 하지만 부하가 심한 환경에 들어갈 서버를 만들 때는 적절하지 않는데, 캐시 기반 스레드 풀의 경우, 작업은 큐에 들어가는 것이 아니라 실행을 담당하는 스레드에 바로 넘겨진다. 서버 부하가 심해서 모든 CPU가 100%에 가깝게 이용되고 있는 상황에서 새 태스크가 들어오면 더 많은 스레드가 만들어 질 것이고 상황이 더 나빠질 것이다. 따라서 부하가 심한 곳에서는 Executors.newFixedThreadPool을 이용해서 스레드 개수가 고정된 풀을 만들어 사용하는 것이 좋다.
작업 큐를 손수 구현하는 것은 삼가야 할 뿐 아니라, 일반적으로는 스레드를 직접 이용하는 것도 피하는 것이 좋다. Thread는 작업의 단위였을 뿐 아니라 작업을 실행하는 메커니즘 이였다. 하지만 작업과 실행 메커니즘이 분리되므로써 더 이상 중요한 역할을 하지 못한다. 중요한 것은 작업의 단위이며, 태스크라 부른다. 태스크에는 두 가지 종류가 있는데, Runnable과 Callable이다. 태스크를 실행하는 일반 메커니즘은 실행자 서비스다.
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[병행성]규칙70. 스레드 안전성에 대해 문서로 남겨라 (0) | 2017.05.08 |
---|---|
[병행성]규칙69. wait나 notify 대신 병행성 유틸리티를 이용하라 (0) | 2017.05.08 |
[병행성]규칙67.과도한 동기화는 피하라. (0) | 2017.05.08 |
[병행성]규칙66. 변경 가능 공유 데이터에 대한 접근은 동기화하라 (0) | 2017.05.07 |
[예외]규칙65. 예외를 무시하지 마라 (0) | 2017.05.07 |