개념
동작 원리
사용 방법
Java - ExecutorService 인터페이스 & Executors 클래스
장점
1. 프로그램 성능저하 방지: 매번 발생되는 작업을 병렬처리하기 위한 스레드 생성/수거에 따른 부담은 프로그램의 전체적인 퍼포먼스 저하시킴
2. 다수의 사용자 요청을 처리하기 위해: 다수의 사용자의 요청을 수용하고, 빠르게 처리하고 대응하기 위해
단점
1. 너무 많이 만들어두면 메모리 낭비: 쓰이지 않는 스레드는 아무일도 하지 않고 메모리만 차지
2. 유휴 스레드 발생: 여러 스레드가 병렬적으로 작업처리하면서 작업완료 소요시간이 다를 경우 A스레드는 계속해서 처리하는 동안 BC는 유휴 시간 발생
forkJoinPool로 방지
동작원리
synchronized
메서드가 호출되면 스레드는 이 메서드를 호출하는데, 이 때:synchronized
메서드를 exit하면서 monitor를 해제함장점
1. synchronization 코드가 모두 하나의 장소에 집중되어 있고, 코드를 사용하는 사람은 코드 구현을 몰라도 됨
2. 프로세스의 숫자에 영향 받지 않음. 원하는 프로세스의 수만큼에 사용 가능
3. 뮤텍스와 같이 해제할 필요 없음
Mutex vs. Monitor vs. Semaphore
synchronized
키워드가 붙은 코드 블락에서 뮤텍스 존재Semaphore(int permits)
Semaphore(int permits, boolean fair)
int permits
: 카운터의 초기 & 최댓값. 공유 자원에 동시 접근 가능 최대 스레드 수boolean fair
: 어느 스레드가 접근 권한을 얻을지. fair=true
: 권한 요청 순서대로 권한 주어짐faire=false
: 스레드 스케쥴러가 순서 결정함분할 정복 알고리즘으로 재귀적으로 병렬처리
Work Stealing: 여러개의 deque에서 작업 처리 진행시, 하나의 deque는 바쁘고 다른 하나는 여유로우면 여유있는 deque가 바쁜 deque의 꼬리에 있는 일을 가져가서 처리
사용 방식
1. 처리해야 할 작업을 모두 포함한 작업 생성
2. 작업을 처리할 ForkJoinPool
생성: ForkJoinPool pool = new ForkJoinPool();
3. 작업 수행
ForkJoinPool commonPool = ForkJoinPool.commonPool(); // ForkJoinPool에 public static 키워드 붙인 것과 같은 의미
ForkJoinPool forkJoinPool = PoolUtil.forkJoinPool;
commonPool()
- 작업별로 스레드풀을 따로 만드는 것을 지양하기 때문에 자원 사용을 줄임기타
ExecutorService
에 구현된 메서드 참고: