자바

자바 스레드풀 ThreadPool : 스레드풀 생성과 스레드풀 종료

알통몬_ 2017. 3. 17. 20:15
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

스레드풀 : 작업 처리를 할 때 사용되는 스레드를 정해진 갯수만큼 정해놓은 뒤

작업 큐에 들어오는 작업들을 하나씩 스레드들이 맡아서 처리

작업 처리가 끝난 스레드는 다시 작업 큐에 새로운 작업을 가져와 처리

=> 작업 처리 요청이 엄청나게 늘어나도 스레드의 전체 갯수는 늘어나지 않습니다.

==> 애플리케이션의 성능이 급격히 저하되지는 않게 됩니다~


자바에서는 스레드풀 사용을 위해 ExecutorService Interface와 Executors Class를 제공합니다.

Executors의 다양한 static method들을 이용해 ExecutorService 구현 객체를 만들 수 있습니다.

==> 바로 이것이 스레드 풀(ThreadPool)입니다


스레드풀 생성 방법

=> ExecutorService 구현 객체는 Executors Class의  두 메소드 중 하나를 이용하시면 됩니다.

메소드명                                    초기 스레드 수      코어 스레드 수        최대 스레드 수

newCachedThreadPool()                      0                      0                      Integer.MAX_VALUE

newFixedThreadPool(int nThreads)       0                    nThreads                nThreads


초기 스레드 수란

 : ExecutorService 구현 객체가 생성될 때 생성되는 스레드 수

코어 스레드 수란

 : 사용되지 않는 스레드를 스레드 풀에서 제거할 때 최소한으로 유지해야할 스레드 수

최대 스레드 수란

 : 스레드 풀에서 관리하는 최대 스레드 수


newCachedThreadPool() 로 생성된 스레드 풀 특징 :

 초기, 코어 스레드 수는 0개이고, 스레드 수보다 작업 개수가 많을 경우 새 스레드를 생성시켜 작업 처리

최대 스레드 수는 int 값이 가질 수 있는 최댓값과 같은데 운영체제의 성능과 상황에 따라 달라질 수 있습니다.

1개 이상의 스레드가 추가되었을 경우에는 60초동안 추가된 스레드가 아무 작업도 하고 있지 않다면

추가된 스레드를 종료하고 스레드 풀에서 제거

구현 객체 생성 방법

ExecutorService executorService = Executors.newCachedPool();


newFixedThreadPool(int nThreads)로 생성된 스레드 풀의 초기 스레드 수는 0개이고,

코어 스레드 수는 nThreads 만큼입니다.

스레드 수보다 작업 수가 많을 경우 새 스레드를 생성시켜 작업 처리

최대 스레드 수는 nThreads입니다.

스레드가 놀고 있더라도 스레드 개수가 줄어들지 않음.

CPU 수 만큼 스레드를 사용하는 스레드 풀 생성 방법

ExecutorService executorService = Executors.new FixedThreadPool(

Runtime.getRuntime().availableProcessors()

};

ThreadPoolExecutor를 생성해 코어, 최대 스레드 수를 설정할 수있음

ex)

ExecutorService es = new ThreadPoolExecutor (

4, // 코어 스레드 수

120, // 최대 스래드 수

100L, // 놀고 있는 시간

TimeUnit.SECONDS, // 놀고 있는 시간 단위

     new SynchronousQueue<Runnable>() // 작업 큐

)


스레드 풀 종료

스레드 풀의 경우 main 스레드가 종료되도 작업 처리를 위해 계속 실행 상태로 남아있음.

때문에 main()의 실행이 끝나도 애플리케이션 프로세스는 죽지 않음

애플리케이션 프로세스 종료를 위해서는 스레드 풀을 종료시켜서 스레드들이 종료상태가 되도록해야함.

ExecutorService는 종료와 관련해서 세가지 메서드를 제공.


리턴타입                        메서드명(매개변수)          설명

void                       shutdown()                          현재 처리 중인 작업뿐 아니라 작업 큐에 대기하고                                                                             있는 모든 작업을 처리한 뒤에 스레드풀을 종료

List<Runnable>       shutdownNow()               현재 작업 처리 중인 스레드를 interrupt해서 작업 중지를 

                                                             시도하고 스레드풀을 종료시킵니다. 리턴값은 작업 큐에 있는                                                                         미처리된 작업(Runnable)의 목록이다.

boolean         awaitTermination(long timeout)   shutdown() 메서드 호출 이후, 모든 작업 처리를 timeout

                                                               시간 내에 완료하면 true 를 리턴하고 완료하지 못하면 작업                                                                 처리 중인 스레드를 interrupt하고 false를 리턴합니다. 


남아있는 작업을 마무리시키고 스레드 풀을 종료할 때 => 일반적으로 shutdown() 호출하고,

남아있는 작업과는 상관없이 스레드 풀을 종료할 때는 shutdownNow()를 호출

executorService.shutdown() or shutdownNow()


이상입니다.

  

반응형