quartz를 사용하고 멀티쓰레드로 작업을 병렬로 처리하던중.. 작업지연으로 인해서 이전 작업이 끝나기도 전에 다음 작업이 시작된다. 뭐.. 가장 좋은 방법은 단순하게 쿼즈가 실행하는 쓰레드 하나만 사용하면 좋것지만.. DB 성능 문제로 인해서 꼭 병렬처리를 수행해야 한다면.. ?? 이때.. Callable 인터페이스를 사용하여 쓰레드의 결과값을 받을 수 있다.

Launcher.java
private final ExecutorService executor  = Executors.newFixedThreadPool(THEAD_SIZE);

public void excute() {
    Future[] future = new Future[THEAD_SIZE];
    for(int i = 0;i<THEAD_SIZE;i++) {
        future[i] = executor.submit(new WokerThread(synchData, 1, totalCount, reqVo));                       
    }
    for(int i = 0;i<THEAD_SIZE;i++) {
        info.info("[" + future[i].get() + "] 종료" );   
    }
}

Callable을 구현한 넘
import java.util.concurrent.Callable;

public class WokerThread implements Callable<String> {
  
    public String call() {       
        while(true) {           
            return (String)Thread.currentThread().getName();
        }
    }
}

위에 샘플은 단순한 사용방법을 구현했지만.. 다양한 방법으로 유용하게 사용할 수 있을듯.


Posted by 짱가쟁이