본문 바로가기

Weekly I Learnd

[W.I.L]ThreadPoolExecutor

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 넘어서는 쓰레드 들을 대기처리하기 위해 사용

[던질 수 있는 에러]

IllegalArgumentException :

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