허원철의 개발 블로그

Thread Pool 이해하기 본문

java

Thread Pool 이해하기

허원철 2017. 4. 1. 16:12
이번 글은 Thread Pool에 대한 기본적인 내용입니다.

 

 
Process : 운영체제에서 하나의 어플리케이션
Thread  : Process에서 하나의 작업
 
 
Process에서 오직 하나의 Thread만 가지게 된다면..?
 
Server 경우, 다수의 Client가 동시에 접근하지 못 합니다.
Client 경우, UI 변경와 네트워크 통신이 자유롭지 못 합니다.
 
 
Multi Thread 
 
여러 Thread를 동시에 만들어 실행(병렬처리) 합니다. Java에 경우, Thread Class, Runnable Interface를 이용하여 Main Thread와는 별개로 Work Thread를 만들 수 있습니다.
 
※ 동시성(Concurrency) 와 병렬성(Parallelism)
 
동시성 싱글 코어에서 멀티 스레드를 동작시키기 위한 방식으로 멀티 태스킹을 위해 여러 개의 스레드가 번갈아가면서 실행되는 성질을 말한다. 동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아가면서 조금씩 실행되고 있는 것이다.
 
병렬성은 멀티 코어에서 멀티 스레드를 동작시키는 방식으로, 한 개 이상의 스레드를 포함하는 각 코어들이 동시에 실행되는 성질을 말한다. 병렬성은 데이터 병렬성(Data parallelism)과 작업 병렬성(Task parallelism)으로 구분된다.
 
- 데이터 병렬성
 
데이터 병렬성은 전체 데이터를 쪼개 서브 데이터들로 만든 뒤, 서브 데이터들을 병렬 처리하여 작업을 빠르게 수행하는 것을 말한다. 자바 8에서 지원하는 병렬 스트림이 데이터 병렬성을 구현한 것이다. 서브 데이터는 멀티 코어의 수만큼 쪼개어 각각의 데이터들을 분리된 스레드에서 병렬 처리한다.
 
- 작업 병렬성
 
작업 병렬성은 서로 다른 작업을 병렬 처리하는 것을 말한다. 대표적인 예는 웹 서버로, 각각의 브라우저에서 요청한 내용을 개별 스레드에서 병렬로 처리한다.
 
<출처 : '이것이 자바다' 신용권 저>
 
그렇다고 해서 Thread를 계속 늘려가는 건 좋은 것 일까? 당연히 아닙니다. 서버나 클러언트에는 하드웨어에 제한적인 사항이 있기 때문에 관리할 필요가 있습니다.
 
 
Thread Pool은 무엇인가..?
 
작업 처리에 사용되는 스레드를 제한된 개수만큼 정해 놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리하는 것입니다. Java에 경우, 기본적으로 Executors Class, ExecutorService Interface를 이용하여 Thread Pool를 만들 수 있습니다.
 
1) Single Thread Pool
- ExecutorService executorService = Executors.newSingleThreadExecutor();
- 단일 Worker Thread를 사용합니다.
- 실패 시, 새로운 Thread를 생성하지 않습니다.
 
2) Fixed Thread Pool
- ExecutorService executorService = Executors.newFixedThreadPool(int nThreads);
- 고정된 Worker Thread를 사용하며, 모든 Thread를 사용 중 이라면 Queue에 쌓여 대기 합니다.
- 실패 시, 새로운 Thread를 생성하여 대체됩니다.
 
3) Cached Thread Pool
- ExecutorService executorService = Executors.newCachedThreadPool();
- 필요에 따라서 새로운 Thread를 생성하며, 이전에 생성된 Thread가 존재하면 재사용 합니다.
- 기본적으로 60초 정도 Thread가 유지됩니다.
- 비동기 작업에 사용하는데 합리적일 수 있습니다.
 
4) Scheduler Thread Pool
- ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(int corePoolSize);
- 지정된 delay 후에 실행하거나 주기적으로 실행하도록 명령을 예약 할 수 있는 Thread Pool 입니다.
 
5) Work Stealing Thread Pool
- ExecutorService executorService = Executors.newWorkStealingPool(int parallelism);
- 자바 8에서 새로 생긴 Thread Pool 입니다.
- 지정된 parallelism을 지원할만큼 충분한 Thread를 유지하고 여러 Queue을 사용하여 경합을 줄이는 Thread Pool을 만듭니다.
- Thread를 동적으로 늘리고 줄일 수 있습니다.
- 작업이 실행되는 순서를 보장하지 않습니다.
 

 

참고

 

- ThreadPool

 


'java' 카테고리의 다른 글

Lombok - 간략 정리  (416) 2017.06.01
Google - Guava  (423) 2017.04.06
Java - Garbage First(G1) Garbage Collection  (417) 2017.03.12
Java - JVM Architecture  (429) 2017.03.08
Java - Compare GC  (406) 2017.03.07
Comments