소프트웨어 개발/Java - Basic

자바 API를 이용한 쓰레드풀 생성 샘플소스. Executors.newFixedThreadPool() 이용 [출처] 자바 API를 이용한 쓰레드풀 생성 샘플소스. Executors.newFixedThreadPool()

늘근이 2014. 10. 23. 19:54

http://blog.naver.com/lover4908/110039084541


바 1.5 버전 부터 쓰래드를 지원하기 위한 API가 강력해진거 같다.

 

모, 일단 라이브러리가 많이 늘어난거 같다. 래치, 배리어, 쓰레드풀 , 퓨처패턴 등등등......

 

나중에 필요할때 써 먹을라고, 관련되는 녀석 공부하던중에

 

자바 1.5부터 지원되는 쓰레드풀 생성하는 아주작은 샘플을 만들어 보았습니당~

 

 

/**
 * 
 */
package test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author 이준성
 *
 */
public class ThreadPoolTest {

 final static int THREADCOUNT = 10;
 
 /**
  * @param args
  */
 public static void main(String[] args) {
  
  
  // 쓰레드 풀 생성. THREADCOUNT 개수 만큼
  ExecutorService exec = Executors.newFixedThreadPool(THREADCOUNT);
  
  for(int i = 0 ; i<THREADCOUNT*2 ; i++) {
   
   exec.execute(new TestThread());
  }
  
  // 쓰레드풀 생성하고 전부다 사용후에는 반드시 셧다운 해야함~
  exec.shutdown();
  

 }
 
 
 
 // 테스트 쓰래드
 public static class TestThread implements Runnable{

  public void run() {
   
   for(int i=1 ; i<= 100 ; i++) {
    
    System.out.println(Thread.currentThread().getName() + " => "+i);
    try {
     Thread.sleep(100);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
     
   }
   
  }  
  
 }

}

 

 

Executors.newFixedThreadPool(THREADCOUNT) 이 부분에 의해서 쓰레드 풀을 생성해서 풀을 넘겨 줍니다.

 

사실 이거말고도 Executors클래스로 생성할수 있는 쓰레드 풀이 3개가 더 존재하더군요.

캐쉬, 싱글익스큐트 등등.

 

Executors.newFixedThreadPool 이 녀석에 의해서 생성되는 쓰레드 풀은 작업이 하나하나 등록할때마다 새로운 쓰레드를 생성한다고 합니다.

 

작업을 등록하는 부분은 exec.execute(new TestThread()) 이 부분 입니다.

 

쓰레드 풀을 사용하지 않을 경우는 Thread를 상속받던가 Runnable을 구현해서 생성하고 스타트 했지만, 쓰레드풀에 작업을 등록하려면 Runnable 이녀석을 구현해서 인자로 넘겨 주기만 하면 됩니다.

 

또 모든 작업이 끝날시에는 셧다운을 해야하는데, 쓰레드 풀 특성을 곰곰히 생각해보시면, 쉽게 아실거라 생각이 듭니다.

쓰레드풀 자체에서 쓰레드 관리(?) 하기 위한 쓰레드가 생성이 되기 때문에, 셧다운을 해주셔야 합니다. 하지않으면~ 프로세스가 남아있더군요.

 

셧다운 하는 방식도 여러가지가 있더군요. 모두 끝낸후에 셧다운 및 강제종료등등

위에서 사용한 방식은 모두 끝낸후에 종료입니다. 아~ 그리고 셧다운후에 작업을 등록하면 익셉션이 발생한다고 합니다.

 

쓰레드풀에서 퓨터 패턴도 적용되어서~ 작업이 끝난 후에 결과값도 받을수 있습니다.

서브밋이라는 메소드를 사용하면 되더군요.