2014-02-26 4 views
3
에 추가 할

난 내가 집행자로 실행 가능한 개체를 추가 할 수 있습니다실행 가능한 객체의 한계를 지정은 ExecutorService를

ExecutorService executor = Executors.newFixedThreadPool(10); 

를 사용하여 고정 스레드 풀 크기를 지정할 수 있습니다 알고 그들은 스레드가 무료 때마다 실행 풀

executor.execute(Obj); 

나는 100 실행 가능한 개체가 만약 내가 limit the no of objects to be added to the executor service에 예를 원 스레드 풀 크기는 10와 20은 ExecutorService를 추가해야하며, 나머지는 거부해야합니다. 대신 모두 100 개체를 추가하고 대기 상태를 유지, 그것은 단지이 상태

나는 집행자 및 ExecutorService를 API를 통해 갔다 대기의 항목에는 고정 유지하지해야하지만, 찾을 수 없습니다 있도록

I want to create a fixed size waiting list for the executor 어떤 것이 든 가능한 일인 지 알고 싶습니까?

+3

방금 ​​알고 싶어? 권리? 있을 수있다!! 구글 조금 열심히. 힌트. 'BlockingQueue','ThreadPoolExecutor'. – sakura

+1

googlable 키워드 목록에 * 거부 정책 *을 추가하십시오. –

+0

감사합니다. 답변을 얻었습니다! – ItachiUchiha

답변

0

봅니다 포장하는 방법과 Executor 또는 ExecutorService :

public class ExecutorCountWrapper implements Executor { 
    private final Executor executor; 
    private final AtomicInteger count = new AtomicInteger(); 

    public ExecutorCountWrapper(Executor executor) { 
     this.executor = executor; 
    } 

    @Override 
    public void execute(final Runnable command) { 
     count.incrementAndGet(); 
     executor.execute(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        command.run(); 
       } finally { 
        count.decrementAndGet(); 
       }     
      } 
     });   
    } 

    public int getTaskCount() { 
     return count.get(); 
    } 
} 

가 이제 실행을 기다리는 얼마나 많은 작업을 확인할 수 있습니다, 그리고 더 많은 여부를 제출합니다.

+0

@MarkoTopolnik : 어디에서 지원됩니까? –

+0

@MarkoTopolnik :'Executor' 인터페이스는 단 하나의 메소드'void execute (Rnnable)'을 가지고 있습니다. 그래서 당신이 말하는 메소드는 어디에 있습니까? –

1

모든 Executor 서비스 - 단일 고정 캐시 된 스레드 풀은 일반 실행자 ThreadPoolExecutor에 의해 지원됩니다.

당신은 다음과 같은 방법을 실행 재정의 할 수

class FiniteQueuedExecutorService extends ThreadPoolExecutor{ 
    int limitQueueSize=Integer.MAX_VALUE; 

    //matching constructors here 

    @Override 
    public void execute(Runnable command) { 
     if(getQueue().size()>limitQueueSize) 
      throw new RuntimeException("Too Many enqueued runnables"); 
     super.execute(command); 
    } 
} 

참고 :이의 인스턴스를 만들 수 Executors 같은 새로운 정적 공장을 만들어야합니다.

2

ThreadPoolExecutor의 생성자를 살펴보십시오. 집행자에게 제한된 대기열 및 거부 정책을 제공 할 수 있습니다. 거부 정책은 처리 할 수있는 것보다 많은 작업을 제출하려고 할 때 실행자에게 수행 할 작업을 알려줍니다.

예 : 그것의 가능한 경우

ExecutorService executor = 
    new ThreadPoolExecutor(N_THREADS, N_THREADS, 0L, TimeUnit.MILLISECONDS, 
     new LinkedBlockingQueue<Runnable>(CAPACITY), 
     new ThreadPoolExecutor.CallerRunsPolicy()); 
관련 문제