스레드 풀
Thread pool은 task 큐와, 작업자 스레드 집합의 조합.
작업자 스레드는 생산자-소비자 구조를 형성한다.
생산자는 큐에 Task를 추가하고, 작업자 스레드는 새로운 백그라운드 실행을
수행할 준비가 된 유휴 스레드가 있을 때마다 Task를 소비한다.
작업자 스레드 풀은, 태스크를 실행하는 활성 스레드와 실행을 기다리는 유휴 스레드를 모두포함할 수 있다.
스레드 풀의 장점
- 작업자 스레드는 실행할 다음 태스크를 기다리기 위해서, 살아 있을 수 있음. 이는
스레드가 매 태스크를 위해 생성과 파괴(오버헤드 증가)될 필요 없다는 것을 의미한다.
- 스레드 풀은 스레드의 최대개수로 정의된다. 이는 응용프로그램 메모리를 소비하는
백그라운드 스레드 수가 많아져서 스레드 풀에 과부하가 걸리는것을 막기 위해서다.
-모든 작업자 스레드의 생명주기는 스레드 풀 생명주기에 의해 제어된다.
미리 정의된 스레드 풀
Executor 프레임워크는 Executors 팩토리 클래스에서 만들어진 미리 정의된 스레드 풀 유형을 포함한다.
- 고정 크기
고정크기 스레드 풀은, 사용자가 정의한 개수의 작업자 스레드를 유지한다.
종료된 스레드는 작업자 스레드의 일정 스레드 수를 유지하기 위해 새로운 스레드로 대체딘다.
고정된 풀 유형은 Executors.nexFixedThreadPool(n) 으로 생성되며 n은 스레드 수다.
이 스레드 풀 유형은 무한한 태스크 큐를 사용한다. 즉 새로운 태스크가 추가로 더해지면 큐가 자유롭게 증가할수있다.
그러므로 생산자는 태스크를 삽입하는데 실패하지 않는다.
- 동적 크기
동적 크기의 스레드 풀, 즉 캐시된 스레드 풀은 처리할 태스크가 있을 때 새로운
스레드를 만든다. 유휴 스레드는 실행할 새로운 태스크를 60초간 기다리고, 태스크 큐가 비어있는
경우 종료된다. 따라서 스레드 풀은 실행할 태스크 수와 함꼐 늘어나고 줄어든다.
Executors.newCachedThreadPool()로 생성한다.
- 싱글스레드 실행자
이 풀은 큐에서 task를 처리하기위해 하나의 작업자 스레드를 가진다.
태스크는 차례대로 실행되고 스레드 안전이 침해될수없다.
Executors.newSingleThreadExecutor()로 생성한다.
'안드로이드 > Thread' 카테고리의 다른 글
안드로이드 자바 ThreadPoolExecutor Thread (스레드) 설정 (0) | 2017.12.06 |
---|---|
자바 안드로이드 custom thread pool (커스텀 스레드 풀) (0) | 2017.12.06 |
안드로이드 Executor 프레임워크를 통한 스레드 실행 제어 (0) | 2017.12.06 |
Thread or Task(스레드 및 태스크) 설계 및 실행 전략 (0) | 2017.07.29 |
자바 스레드 암시적 잠금 종류 및 생산자와 소비자 (0) | 2017.07.28 |