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 |