2017-10-31 2 views
1

여러 생성자와 단일 소비자 (항목의 사후 처리에 충분 함)가있는 차단 대기열이 있습니다.Java - 단일 스레드 실행자

프로듀서는 실행 프로그램 풀로 작업을 보내고 대기열에 작업자가 작업을 추가하는 일정에 따라 시작됩니다.

소비자 스레드를 시작하는 방법에 대한 제 질문. 지금은

나는 루프, 어쩌면 더 나은 솔루션이 경우에 존재하는 동안 무한으로 큐를 제공 singleThreadExecutorPool 방법에 시작에 보내 @EventListener (SpringBoot)가 있습니다. 소비 큐에 대한 꽤 일반적인 패턴처럼 보입니다.

+0

단순히 생산자가 소비자 집행자에게 직접 피드를 보내지 않는 이유는 무엇입니까? – teppic

+0

나는 IO 및 네트워크 서비스 대기 시간을 원활하게 늘리기 위해 여러 소비자가 있습니다. 그리고 나를 위해 하나의 소비자를 관리하는 것이 훨씬 쉽습니다. 하지만 그래, 나는 또한 당신의 접근 방식이 좋을 수도 있다고 생각 하나, 결과 생산자들이 (한 명) 소비자가 그것을 먹을 때까지 기다려야한다는 말인가요? 내가 그것에 대해 생각하지만 대기열의 성취에 따라 논리 (및 통계 모니터링)를 구현할 수 있기 때문에 대기열을 결정할 수 있습니다. (예, 어쩌면 최선의 접근법이 아니기 때문에 여기에서 질문합니다 : D) – Sonique

+0

또는 내부 대기열 구현 소비자? – Sonique

답변

0

당신의 접근 방식은 완벽합니다. 그런 경우에 대한 나의 개인적인 패턴이 있습니다.

@Component 
public class ConsumerTask implements Runnable { 

    private ExecutorService executorService; 
    private BlockingQueue<Object> queue; 

    // use dependency injection if needed 
    public ConsumerTask(BlockingQueue<Object> queue) { 
    executorService = Executors.newSingleThreadExecutor(); 
    this.queue = queue; 
    } 

    @PostConstruct 
    public void init() { 
    executorService.execute(this); 
    } 

    @PreDestroy 
    public void destroy() { 
    // unlike shutdown() shutdownNow() sends interruption to running tasks 
    executorService.shutdownNow(); 
    } 

    @Override 
    public void run() { 
    try { 
     while (true) { 
     Object o = queue.take(); 
     // process o 
     } 
    } catch (InterruptedException e) { 
     // we were interrupted by shutdownNow(), restore interrupted status and exit 
     Thread.currentThread().interrupt(); 
    } 
    } 
} 
관련 문제