ThreadPool 이란?
생성 가능한 최대 스레드의 갯수를 정해 놓고 작업 큐에 저장 되는 작업들을 하나씩 쓰레드 풀에 존재하는 쓰레드가 처리하도록 하는 방법이다 .
직접 쓰레드를 관리하고 싶다면 ThreadPoolExecutor 클래스의 인스턴스를 생성자로 생성하여 사용하면 된다.
ThreadPoolExecutor는 생성자를 사용하여 corePoolExecutor, maximumPoolSize, keepAliveTime, workQueue등을 설정할 수 있다.
생성된 쓰레드들은 main 쓰레드가 종료 되더라도 작업을 마칠 때 까지 Runnable 상태에 남아 있게 된다. 따라서 프로세스를 종료 시키려면 쓰레드 풀의 쓰레드 들이 모두 Terminated 상태가 되도록 유도 해야 한다.
ThreadPoolExecutor 에서 제공하는 메소드
public void shutdown()
- 작업 큐에 남아있는 모든 작업까지 처리 후 스레드들을 Terminated 상태로 변경
public List<Runnable> shutdownNow()
- 현재 Runnable 상태에 있는 스레드들을 중지시키고, 작업 큐에 남아있는 작업들을 List화 시켜서 반환한다.
public boolean awaitTermination(long timeout,TimeUnit unit)
- shutdown 메소드를 호출한 뒤, timeout 시간 내에 작업들을 모두 처리 완료하면 true를 반환,
지정한 시간내에 완료하지 못할 경우 Runnable 상태에 있는 스레드들을 모두 중지하고, false 를 반환한다.
[이번주에 사용한 생성자]
- corePool Executor : allowCoreThreadTimeOut설정 되지 않은 상태에서 풀에 유지하는 쓰레드의 갯수
- maximumPoolSize : 풀에서 최대로 허용하는 쓰레드의 갯수
- keepAliveTime : 코어의 쓰레드 보다 실행하는 쓰레드의 수가 많을 때, 새로운 작업을 실행하기 위해서 기다릴 수 있는 최대의 시간 /keepAliveTime 시간동안 놀고 있으면 (idle) 자동으로 개수를 줄인다
- Unit : keepAliveTimm의 시간 단위
- workQueue : corePoolSize를 넘어서는 쓰레드 들을 대기처리하기 위해 사용
[던질 수 있는 에러]
corePoolSize < 0
keepAliveTime < 0
maximumPoolSize <= 0
maximumPoolSize < corePoolSize
NullPointerException- 경우 workQueue 나 threadFactory또는 handler가 null인 경우
[참고 문서]
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html
'Weekly I Learnd' 카테고리의 다른 글
[W.I.L]CommandLineRunner, ApplictionRunner (0) | 2021.11.28 |
---|---|
[WIL] test code /spring webflux /가짜 중복,진짜 중복 (0) | 2021.11.06 |
[W.I.L] 개인공부 (0) | 2021.06.28 |
[W.I.L] 15주차 모의면접 주차(feat. 항해99 마지막 주차) (0) | 2021.06.06 |
[W.I.L]13주차 (실전프로젝트 5주차)(feat.항해99) (0) | 2021.05.30 |