2010-04-08 4 views
1

여러 개의 다른 태스크 (Runnable을 구현하는 모든 것)를 보내는 Executors.newFixedThreadPool (1)이 있습니다. 큐에 올라서 순차적으로 올바르게 실행됩니까? 한 번에 각 작업 중 하나를 실행 중이거나 대기 상태로 둘 수있는 가장 좋은 방법은 무엇입니까? 이미 큐에있는 ExecutorService에 전송 된 모든 작업을 무시하고 싶습니다.ExecutorService 큐에있는 각 Runnable 타입 중 하나만을 제한합니다.

답변

0

스레드 풀이 이 아니고이 작업 순서를 보증합니다. 사용 ThreadPoolExecutor.DiscardPolicy를 사용하여 당신이 거부 된 실행 핸들러를 설정할 수 있습니다 두 번째 부분에 관해서는

,

1

ThreadPoolExecutor 나는이 Executors.newFixedThreadPool (1) 나는 (모든 Runnable를 구현)에 여러 가지 작업을 보내도록하고, 그들은 대기열에 올라서 순차적으로 올바르게 실행됩니까?

예, 기본적으로 기본 스레드 풀 실행 프로그램은 LinkedBlockingQueue를 사용하여 만들어집니다. 작업자 스레드가 하나 뿐이므로 대기열이 FIFO 방식으로 사용되므로 작업이 순서대로 실행됩니다.

각 작업 중 하나만 실행 중이거나 한 번에 대기하도록 허용하는 가장 좋은 방법은 무엇입니까? 이미 큐에있는 ExecutorService에 전송 된 모든 작업을 무시하고 싶습니다.

제가 생각할 수있는 가장 쉬운 방법은 ThreadPoolExecutor를 확장하는 고유 한 ExecutorService를 만드는 것입니다. 그런 다음 Super 클래스 execute에 위임하기 전에 BlockingQueue # contains (Object)를 호출하도록 execute() 메서드를 재정의합니다.

public class LimitedExecutorService extends ThreadPoolExecutor { 
    public LimitedExecutorService(final int nThreads) { 
     super(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); 
    } 

    @Override 
    public void execute(Runnable command) { 
     if (!this.getQueue().contains(command)) { 
      super.execute(command); 
     } else { 
      //reject 
     } 
    } 
} 

참고 : 많은 사람들이 당신이있는 ThreadPoolExecutor를 확장하지한다고 주장하지만, 대신 당신은 ExecutorService를 구현하고 클래스를 사용하면 (일명 구성)에 위임 ThreadPoolExecutor에 포함되어 있다고 가정합니다.