2017-04-19 8 views
4

내 사용 사례 : 'N'스레드가 항상 집행자 시작 후 사용할 수있는 것을 의미 스레드 풀의 최소 크기 'N'을 설정필요에 따라 스레드를 생성하고 적용 가능한 경우 만료시키는 ThreadPoolExecutor를 만드는 방법은 무엇입니까?

  • .
  • 스레드 풀의 최대 크기를 'M'으로 설정하십시오.
  • 모든 'M'스레드가 사용 중이면 수신 작업이 대기열에 있어야합니다.
  • 유휴 상태의 시간 초과를 기준으로 만료 (M -N) 스레드.

나는 HttpClient 뒤에 풀 관리자와 비슷한 설정이 가능하다고 생각합니다. 내가 ThreadPoolExecutor를 사용하여 그것을 달성하려고하지만 길을 찾을 수 없습니다. 가능한가?

다음은 테스트 할 예입니다. 이것에 대해

public class ExecutorExample { 

    public static void main(String[] args) throws InterruptedException { 
     int minPoolSize = 2; 
     int maxPoolSize = 10; 
     int ttlMillis = 100; 
     ThreadPoolExecutor startupExecutor = new ThreadPoolExecutor(minPoolSize, 
       maxPoolSize, // surprisingly this is not obeyed. 
       ttlMillis, 
       TimeUnit.MILLISECONDS, 
       new LinkedBlockingQueue<Runnable>()); 

     for (int i = 0; i < 20; i++) { 
      System.out.println(Thread.currentThread().getName() + ":" + startupExecutor.getCorePoolSize()); 
      startupExecutor.execute(new MyRunnable(i)); 
     } 

     for (int i = 0; i < 20; i++) { 
      Thread.sleep(1000); 
      System.out.println(Thread.currentThread().getName() + ":" + startupExecutor.getCorePoolSize()); 
     } 
    } 

} 

class MyRunnable implements Runnable { 

    int n; 

    public MyRunnable(int n) { 
     this.n = n; 
    } 

    @Override 
    public void run() { 
     try { 
      Thread.sleep(2000); 
      System.out.println(Thread.currentThread().getName() + ":" + n); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    } 

} 
+1

필요에 따라 ThreadPoolExecutor (corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue)가 아닌가? –

+0

@RomanPuchkovskiy 어떤 큐 객체를 염두에 두시겠습니까? 나는 시험 할 것이다. – phani

+0

당신이 이상한 요구 사항입니다 ... 왜 들어오는 작업이 대기되기 전에 스레드 수를 N에서 M *으로 늘려야합니까? –

답변

0

방법 :

 ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); 

ThreadPoolExecutor

편집 : 일반적으로 내가 사용하는 큐가 바운드 형식 블로킹 큐입니다.

BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue(queueCapacity, true); 

EDIT2 : 최대 풀 크기는 대기열이 가득 차면 시작됩니다. 무한 대기열을 사용하고 있으므로 스레드 수는 2를 초과하지 않습니다. 아래 링크를 참조하십시오.

rules-of-a-threadpoolexecutor-pool-size

넣어 크기 (1) 당신은 차이를 볼 수 있습니다.

new LinkedBlockingQueue<>(1)); 

편집 3 : startupExecutor.getPoolSize()으로 startupExecutor.getCorePoolSize()을 변경하려면 예에서.

+0

시간 초과 후 스레드가 만료되지 않습니다. 당신이 내가 사용하기를 원하는 큐의 실제 구현으로 그것을 업데이트 할 수 있습니까? – phani

+0

스레드가 실행 된 후 스레드가 만료된다는 의미입니까? –

+0

시간 초과 후 유휴 상태의 스레드 만료 (스레드가 유휴 상태이므로 큐가 비어 있음). ThreadPoolExecutor를 테스트 할 수있는 샘플 코드를 게시했습니다. – phani