ThreadPoolExecutor 를 사용한 샘플코드이다.


import java.util.concurrent.ArrayBlockingQueue;

import java.util.concurrent.RejectedExecutionException;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;


public class MyThreadPoolExecutor {

int corePoolSize = 1; // 스레드 풀은 실행할 작업이 없어도 corePoolSize 를 유지한다.

int maxPoolSize = 10;// xaximumPoolsize 는 동시에 얼마나 많은 개수의 스레드가 동작할 수 있는지를 제한하는 최대값.

long keepAliveTime = 10;

// keepAliveTime 는 스레드 유지 시간으로 스레드가 keepAliveTime 이상 대기하고 있으면

// 해당 스레드는 제거 될 수 있음. 풀의 스레드 개수가 corePoolSize 를 넘어서면 제거될 수 있음.

int queueSize = 10;

ThreadPoolExecutor threadPool = null;

final ArrayBlockingQueue<Runnable> queue = 

new ArrayBlockingQueue<Runnable>(queueSize);

public MyThreadPoolExecutor(){

threadPool = new ThreadPoolExecutor(corePoolSize,maxPoolSize,

keepAliveTime, TimeUnit.SECONDS, queue);

threadPool.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());

  • ABORT : AbortPolicy 적용. rejection-policy가 정의되지 않았을 경우 기본 적용되는 Policy로 Exception을 throw한다.(default이다. 스레드를 호출한 곳에서 직접 예외처리를 해줘야한다.)

  • CALLER_RUNS : CallerRunsPolicy 적용. 해당 Application이 과부하 상태일 경우 TaskExecutor에 의해서가 아닌 Thread에서 직접 Task를 실행시킬 수 있게 한다.

  • DISCARD : DiscardPolicy 적용. 모든 Task가 반드시 실행되어야 한다라는 제약점이 없는 경우 적용 가능한 Policy로써 해당 Application이 과부하 상태일 경우 현재 Task의 실행을 Skip한다.

  • DISCARD_OLDEST : DiscardOldestPolicy 적용. 모든 Task가 반드시 실행되어야 한다라는 제약점이 없는 경우 적용 가능한 Policy로써 해당 Application이 과부하 상태일 경우 Queue의 Head에 있는 Task의 실행을 Skip한다.


}//end of constructor().

public void runTask(Runnable task){

try{

threadPool.execute(task);

}catch(RejectedExecutionException e){

return;

}

}

public void shutDown(){

threadPool.shutdown();

}

}//end of MyThreadPoolExecutor().

'Java' 카테고리의 다른 글

[Java] JUnit 사용하기  (0) 2014.09.12
[Java] J Unit 이란?  (0) 2014.09.11
[Java] Virtual 함수( 가상함수)  (0) 2014.09.04
Bing Translator API를 이용한 번역 - JAVA  (0) 2012.07.21
Java ::: cmd 명령어 실행법  (0) 2012.06.28
블로그 이미지

kuku_dass

,