JavaTM Platform
Standard Ed. 6

java.util.concurrent
클래스 ThreadPoolExecutor

java.lang.Object 
  상위를 확장 java.util.concurrent.AbstractExecutorService 
      상위를 확장 java.util.concurrent.ThreadPoolExecutor
모든 구현된 인터페이스:
Executor , ExecutorService
직계의 기존의 서브 클래스:
ScheduledThreadPoolExecutor


public class ThreadPoolExecutor
extends AbstractExecutorService

풀 된 복수의 thread의 1 개를 사용해 송신된 각 태스크를 실행하는 ExecutorService 입니다. 일반적으로은 Executors 팩토리 메소드를 사용해 구성됩니다.

thread 풀에서는, 2 개의 문제에 대처합니다. 우선, 태스크 근처의 호출 오버헤드가 감소하기 위해(때문에), 일반적으로은 대량의 비동기 태스크의 실행시에 퍼포먼스가 향상합니다. 또, 태스크의 컬렉션을 실행할 경우에 소비되는 자원 (thread를 포함한다)의 경계 설정 및 관리를 위한 방법을 제공합니다. 각 ThreadPoolExecutor 도 기본적인 통계 정보 (완료한 태스크의 수등)를 보관 유지합니다.

폭넓은 문맥으로 유용하기 때문에 , 이 클래스에서는 많은 조정 가능한 파라미터나 확장성 훅을 제공합니다. 다만 프로그래머는, 보다 편리한 Executors 팩토리 메소드인 Executors.newCachedThreadPool() (자동 thread 재생이 있는 안 바운드 형식의 thread 풀),Executors.newFixedThreadPool(int) (고정 사이즈의 thread 풀), 및 Executors.newSingleThreadExecutor() (단일 백그라운드의 thread)를 사용해 주세요. 이러한 팩토리 메소드는, 가장 일반적인 사용을 상정한 설정을 사전 설정합니다. 그렇지 않은 경우, 이 클래스를 수동으로 설정해 조정할 때는 다음의 가이드에 따라 주세요.

코어 및 최대 풀 사이즈
corePoolSize (getCorePoolSize() 를 참조)와 maximumPoolSize (getMaximumPoolSize() 를 참조)로 설정된 경계에 따라,ThreadPoolExecutor 는 자동적으로 풀 사이즈를 조정합니다 (getPoolSize() 를 참조). 새로운 태스크가 execute(java.lang.Runnable) 메소드로 송신되어 corePoolSize 보다 적은 수의 thread가 실행중인 경우는, 그 외의 워크스 레드가 IDLE 상태여도, 요구를 처리하기 위해서 새로운 thread가 작성됩니다. corePoolSize 보다 많아, maximumPoolSize 보다 적은 수의 thread가 실행중인 경우, 새로운 thread가 작성되는 것은 큐가 가득해 있는 경우만입니다. corePoolSize 와 maximumPoolSize 를 같은 값으로 설정하면(자), 고정 사이즈의 thread 풀이 작성됩니다. maximumPoolSize 을 Integer.MAX_VALUE 등의 실질적으로 안 바운드 형식인 값으로 설정하면(자), 풀에 임의의 수의 병행 태스크를 포함할 수가 있습니다. 코어 풀 사이즈와 최대 풀 사이즈는 구축시에게만 설정되는 것이 가장 일반적입니다만,setCorePoolSize(int)setMaximumPoolSize(int) 를 사용해 동적으로 변경할 수도 있습니다.
On Demand 구축
디폴트에서는, 새로운 태스크의 도착시에게만 코어 thread가 처음 작성되어 기동됩니다만,prestartCoreThread() 또는 prestartAllCoreThreads() 메소드를 사용해 동적으로 오버라이드(override) 할 수 있습니다. 빈 상태(empty)이 아닌 큐로 풀을 구축하는 경우는, thread를 사전에 기동할 수도 있습니다.
새로운 thread의 작성
새로운 thread는 ThreadFactory 를 사용해 작성됩니다. 특히 지정이 없는 경우는,Executors.defaultThreadFactory() 가 사용됩니다. 이 경우에 작성되는 thread는, 모두 같은 ThreadGroup 내에 있어, 같은 NORM_PRIORITY 우선 순위와 비demon 상태를 가집니다. 다른 ThreadFactory 를 지정하면(자), thread의 이름, thread 그룹, 우선 순위, demon 상태등을 변경할 수 있습니다. 요구시에 newThread 로부터 null 가 돌려주어져 ThreadFactory 가 thread의 작성에 실패하면(자), executor 는 속행합니다만, 태스크를 전혀 실행할 수 없을 가능성이 있습니다.
킵얼라이브 시간
현재 풀에 corePoolSize 의 수보다 많은 thread가 있는 경우, 초과한 만큼의 thread는, IDLE 상태가 되어 있는 기간이 keepAliveTime 를 넘으면(자) 종료합니다 (getKeepAliveTime(java.util.concurrent.TimeUnit) 를 참조). 이것에 의해, 풀이 액티브하게 사용되어 있지 않을 때의 자원의 소비량을 줄일 수가 있습니다. 풀이 나중에 액티브하게 되면(자), 새로운 thread가 구축됩니다. 이 파라미터는,setKeepAliveTime(long, java.util.concurrent.TimeUnit) 메소드를 사용해 동적으로 변경할 수 있습니다. Long.MAX_VALUE TimeUnit.NANOSECONDS 의 값을 사용하면(자), 아이돌 thread가 종료전에 종료하는 일도 실질적으로 무효가 됩니다. 디폴트에서는, corePoolSizeThreads 를 넘는 경우에게만 킵얼라이브 정책를 적용합니다. 다만 keepAliveTime 의 값이 제로 이외이면,allowCoreThreadTimeOut(boolean) 메소드를 사용해, 이 타임 아웃 정책를 코어 thread에도 적용할 수가 있습니다.
큐잉
BlockingQueue 는, 송신된 태스크를 전송 및 보관 유지하기 위해서 사용할 수 있습니다. 이 큐의 사용은, 풀의 사이즈 설정과 서로 작용합니다. 큐잉의 일반적인 방식에는 다음의 3 종류가 있습니다.
  1. 직접 핸드 오프. 워크 큐에 적절한 디폴트의 선택사항은, 태스크를 보관 유지하지 않고 thread에 핸드 오프 하는 SynchronousQueue 입니다. SynchronousQueue 는, 본래는 태스크를 보관 유지합니다. 이 경우, 태스크를 실행하기 위해서 곧바로 이용할 수 있는 thread가 없으면 태스크를 큐에 넣으려고 했을 때에 실패해, 새로운 thread가 구축됩니다. 이 정책에 의해, 내부적인 의존관계(dependencies)를 가질 가능성이 있는 요구 세트의 처리시에 록 업이 회피됩니다. 일반적으로 직접 핸드 오프에서는, 송신된 새로운 태스크가 거부되는 것을 회피하기 위해서, 안 바운드 형식의 maximumPoolSizes 가 필요합니다. 이것에 의해, 평균해 처리 능력을 넘는 속도로 커멘드가 차례차례로 도착하면(자), 안 바운드 형식의 thread가 커질 가능성이 있습니다.
  2. 안 바운드 형식의 큐. 안 바운드 형식의 큐 (사전 정의된 용량을 가지지 않는 LinkedBlockingQueue 등)를 사용하면(자), corePoolSize 의 모든 thread가 Busy 상태인 경우에, 새로운 태스크는 큐내에서 대기합니다. 이것에 의해, corePoolSize 를 넘는 thread는 작성되지 않게 됩니다. 즉 maximumPoolSize 의 값은 효과가 없어집니다. 각 태스크가 완전하게 독립하고 있기 (위해)때문에, 태스크가 상호의 실행에 영향을 주지 않는 경우는 이 방식이 적절하다라고 하는 것이 있습니다 (Web 페이지 서버의 경우 등). 이 방식의 큐잉은, 일시적으로 급증한 요구를 처리하는 경우 등은 편리합니다만, 평균해 처리 능력을 넘는 속도로 커멘드가 차례차례로 도착하면(자), 안 바운드 형식의 워크 큐가 커질 가능성이 있습니다.
  3. 바운드 형식의 큐. 바운드 형식의 큐 (ArrayBlockingQueue 등)는, 한정된 maximumPoolSizes 로 사용하면(자) 자원 부족을 회피할 수 있습니다만, 조정과 제어가 어려워질 가능성이 있습니다. 큐 사이즈와 최대 풀 사이즈는 서로 트레이드 오프의 관계가 되는 일이 있습니다. 큰 큐와 작은 풀을 사용하면(자), CPU 사용율, OS 자원량, 및 콘테키스트스잇팅의 오버헤드는 최소화됩니다만, throughput는 큰폭으로 저하할 가능성이 있습니다. 태스크가 빈번하게 블록 하는 경우는 (입출력이 제한되는 경우 등), 허가하고 있는 thread수보다 많은 thread에 대해서, 시스템이 시간을 스케줄 할 수가 있습니다. 작은 큐를 사용하면(자), 일반적으로 필요한 풀 사이즈는 커집니다. 이것에 의해, CPU 가 보다 Busy가 됩니다만, 과대한 스케줄 설정의 오버헤드가 발생하는 일이 있어, throughput도 저하합니다.
거부된 태스크
executor 가 종료 하고 있는 경우, 또는 executor 가 최대 thread수와 워크 큐 용량의 양쪽 모두로 유한의 경계를 사용해, 한편 포화 상태인 경우,execute(java.lang.Runnable) 메소드로 송신된 새로운 태스크는 거부됩니다. 어느 쪽의 경우도,execute 메소드는,RejectedExecutionHandlerRejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) 메소드를 호출합니다. 사전 정의된 4 개의 핸들러 정책가 준비되어 있습니다.
  1. 디폴트 ThreadPoolExecutor.AbortPolicy 에서는, 거부되면(자), 핸들러는 실행시 RejectedExecutionException 를 throw 합니다.
  2. ThreadPoolExecutor.CallerRunsPolicy 에서는,execute 자체를 호출하는 thread가 태스크를 실행합니다. 이것에 의해, 단순한 피드백 제어 기구가 제공되어 결과적으로 새로운 태스크의 송신 레이트가 저하합니다.
  3. ThreadPoolExecutor.DiscardPolicy 에서는, 실행할 수 없는 태스크가 단지 삭제됩니다.
  4. ThreadPoolExecutor.DiscardOldestPolicy 에서는, executor 가 종료 하고 있지 않는 경우는, 워크 큐의 선두에 있는 태스크가 삭제되어 실행이 재시행됩니다 (한번 더 실패할 가능성이 있어, 그 경우는 이 처리가 반복해진다).
다른 종류 RejectedExecutionHandler 클래스를 정의 및 사용할 수도 있습니다. 그 경우, 특정의 용량 또는 큐잉 정책에서만 동작하도록(듯이) 정책가 설계되고 있을 때는, 특히 주의가 필요합니다.
훅 메소드
이 클래스는,protected 의 오버라이드(override) 가능한 beforeExecute(java.lang.Thread, java.lang.Runnable) 메소드와 afterExecute(java.lang.Runnable, java.lang.Throwable) 메소드를 제공하고 있습니다. 이러한 메소드는, 각 태스크를 실행하는 전후에 불려 갑니다. 이러한 메소드는, 실행 환경을 조작하기 위해서 사용할 수 있습니다 (ThreadLocal 의 재초기화, 통계 정보의 수집, 로그 엔트리의 추가 등). 또, executor 가 완전하게 종료하면(자) 실행할 필요가 있는 특별한 처리를 실행하도록(듯이),terminated() 메소드를 오버라이드(override) 할 수가 있습니다.

훅 또는 콜백 메소드가 예외를 throw 하면(자), 내부의 워크스 레드는 실패해 강제 종료합니다.

큐의 보수
getQueue() 메소드를 사용하면(자), 감시나 디버그의 목적으로 워크 큐에 액세스 할 수 있습니다. 그 외의 목적으로 이 메소드를 사용하지 않는 것이 강하고 추천 되고 있습니다. 제공되는 2 개의 메소드 remove(java.lang.Runnable)purge() 는, 큐에 들어가 있는 대량의 태스크가 삭제될 때, 기억 영역의 재생을 지원하기 위해서 이용할 수 있습니다.
finalize
풀이 프로그램으로 참조되지 않게 되어, 한편 남아 있는 thread가 없어지면(자), 그 풀에서 자동적으로 shutdown 가 실행됩니다. 사용자가 shutdown() 의 호출을 잊었을 때에도, 참조되어 있지 않은 풀이 재생되도록(듯이) 하는 경우는, 미사용의 thread가 최종적으로 종료하도록(듯이) 설정할 필요가 있습니다. 거기에는, 적절한 킵얼라이브 시간을 설정하거나 제로 코어 thread의 하한을 사용하거나allowCoreThreadTimeOut(boolean) 를 설정하거나 합니다.

확장 기능의 예. 이 클래스의 대부분의 확장 기능은, 1 개(살) 이상의 protected 훅 메소드를 오버라이드(override) 합니다. 예를 들어, 다음의 예는, 단순한 일시정지 및 재개의 기능을 추가하는 서브 클래스입니다.

 class PausableThreadPoolExecutor extends ThreadPoolExecutor {
   private boolean isPaused;
   private ReentrantLock pauseLock = new ReentrantLock();
   private Condition unpaused = pauseLock.newCondition();

   public PausableThreadPoolExecutor(...) { super(...); }

   protected void beforeExecute(Thread t, Runnable r) {
     super.beforeExecute(t, r);
     pauseLock.lock();
     try {
       while (isPaused) unpaused.await();
     } catch (InterruptedException ie) {
       t.interrupt();
     } finally {
       pauseLock.unlock();
     }
   }

   public void pause() {
     pauseLock.lock();
     try {
       isPaused = true;
     } finally {
       pauseLock.unlock();
     }
   }

   public void resume() {
     pauseLock.lock();
     try {
       isPaused = false;
       unpaused.signalAll();
     } finally {
       pauseLock.unlock();
     }
   }
 }
 

도입된 버젼:
1.5

상자의 클래스의 개요
static class ThreadPoolExecutor.AbortPolicy
          RejectedExecutionException 를 throw 하는 거부된 태스크의 핸들러입니다.
static class ThreadPoolExecutor.CallerRunsPolicy
          executor 가 종료 하고 있지 않는 경우에,execute 메소드의 호출로 거부된 태스크를 직접 실행한다, 거부된 태스크의 핸들러입니다.
static class ThreadPoolExecutor.DiscardOldestPolicy
          executor 가 종료 하고 있지 않는 경우에, 가장 낡은 미처리의 요구를 파기해 execute 를 재시행한다, 거부된 태스크의 핸들러입니다.
static class ThreadPoolExecutor.DiscardPolicy
          거부된 태스크를 통지없이 파기하는 거부된 태스크의 핸들러입니다.
 
생성자 의 개요
ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit  unit, BlockingQueue <Runnable > workQueue)
          지정된 초기 파라미터, 및 디폴트의 thread 팩토리라고 거부된 실행 핸들러를 사용해, 새로운 ThreadPoolExecutor 를 작성합니다.
ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit  unit, BlockingQueue <Runnable > workQueue, RejectedExecutionHandler  handler)
          지정된 초기 파라미터, 및 디폴트의 thread 팩토리를 사용해, 새로운 ThreadPoolExecutor 를 작성합니다.
ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit  unit, BlockingQueue <Runnable > workQueue, ThreadFactory  threadFactory)
          지정된 초기 파라미터, 및 디폴트의 거부된 실행 핸들러를 사용해, 새로운 ThreadPoolExecutor 를 작성합니다.
ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit  unit, BlockingQueue <Runnable > workQueue, ThreadFactory  threadFactory, RejectedExecutionHandler  handler)
          지정된 초기 파라미터를 사용해, 새로운 ThreadPoolExecutor 를 작성합니다.
 
메소드의 개요
protected  void afterExecute (Runnable  r, Throwable  t)
          지정된 Runnable 의 실행 완료시에 불려 가는 메소드입니다.
 void allowCoreThreadTimeOut (boolean value)
          이 풀에서, 킵얼라이브 시간내에 도착한 태스크가 없으면 코어 thread가 타임 아웃 및 종료하는 것이 허가되어 새로운 태스크가 도착했을 때는 필요에 따라서 코어 thread를 옮겨놓을 수 있을지 어떨지를 제어하는 정책를 설정합니다.
 boolean allowsCoreThreadTimeOut ()
          이 풀에서, keepAlive 시간내에 도착한 태스크가 없으면 코어 thread가 타임 아웃 및 종료하는 것이 허가되어 새로운 태스크가 도착했을 때는 필요에 따라서 코어 thread를 옮겨놓을 수 있는 경우는, true 를 돌려줍니다.
 boolean awaitTermination (long timeout, TimeUnit  unit)
          종료 요구 후에 모든 태스크가 실행을 완료하고 있었는지, 타임 아웃이 발생하는지, 현재의 thread로 인터럽트가 발생하는지, 그 어느쪽이든가 최초로 발생할 때까지 블록 합니다.
protected  void beforeExecute (Thread  t, Runnable  r)
          지정된 thread로 지정된 Runnable 를 실행하기 전에 불려 가는 메소드입니다.
 void execute (Runnable  command)
          장래가 있는 시점에서 지정된 태스크를 실행합니다.
protected  void finalize ()
          이 executor 가 참조되지 않게 되었을 때에 shutdown 를 호출합니다.
 int getActiveCount ()
          액티브하게 태스크를 실행하고 있는 thread의 대략의 수를 돌려줍니다.
 long getCompletedTaskCount ()
          지금까지 실행이 완료한 태스크의 대략의 총수를 돌려줍니다.
 int getCorePoolSize ()
          thread의 코어수를 돌려줍니다.
 long getKeepAliveTime (TimeUnit  unit)
          코어 풀 사이즈를 넘는 thread가 종료전에 IDLE 상태에 머물 수가 있는, thread의 킵얼라이브 시간을 돌려줍니다.
 int getLargestPoolSize ()
          풀내에 동시에 존재한 최대 thread수를 돌려줍니다.
 int getMaximumPoolSize ()
          thread의 최대 허용수를 돌려줍니다.
 int getPoolSize ()
          풀내의 현재의 thread수를 돌려줍니다.
 BlockingQueue <Runnable > getQueue ()
          이 executor 로 사용하는 태스크 큐를 돌려줍니다.
 RejectedExecutionHandler getRejectedExecutionHandler ()
          실행 가능하지 않은 태스크의 현재의 핸들러를 돌려줍니다.
 long getTaskCount ()
          지금까지 실행이 스케줄 된 태스크의 대략의 총수를 돌려줍니다.
 ThreadFactory getThreadFactory ()
          새로운 thread의 작성에 사용하는 thread 팩토리를 돌려줍니다.
 boolean isShutdown ()
          이 executor 가 종료 하고 있었을 경우,true 를 돌려줍니다.
 boolean isTerminated ()
          종료에 이어 모든 태스크가 완료하고 있었을 경우,true 를 돌려줍니다.
 boolean isTerminating ()
          shutdown 또는 shutdownNow 의 나중에 이 executor 가 종료 처리중이지만, 완전하게 종료하고 있지 않는 경우는, true 를 돌려줍니다.
 int prestartAllCoreThreads ()
          모든 코어 thread를 기동해, IDLE 상태로 처리 대기로 합니다.
 boolean prestartCoreThread ()
          코어 thread를 기동해, IDLE 상태로 처리 대기로 합니다.
 void purge ()
          삭제된 모든 Future 태스크를 워크 큐로부터 삭제하려고 합니다.
 boolean remove (Runnable  task)
          executor 의 내부 큐에 이 태스크가 존재하는 경우는 삭제하기 위해(때문에), 그 태스크가 아직 개시되어 있지 않은 경우는 실행되지 않습니다.
 void setCorePoolSize (int corePoolSize)
          thread의 코어수를 설정합니다.
 void setKeepAliveTime (long time, TimeUnit  unit)
          thread가 종료전에 IDLE 상태에 머물 수가 있는 제한 시간을 설정합니다.
 void setMaximumPoolSize (int maximumPoolSize)
          thread의 최대 허용수를 설정합니다.
 void setRejectedExecutionHandler (RejectedExecutionHandler  handler)
          실행 가능하지 않은 태스크의 새로운 핸들러를 설정합니다.
 void setThreadFactory (ThreadFactory  threadFactory)
          새로운 thread의 작성에 사용하는 thread 팩토리를 설정합니다.
 void shutdown ()
          순서 올바르게 종료을 개시합니다.
 List <Runnable > shutdownNow ()
          실행중의 액티브한 태스크 모든 정지를 시도해 대기중의 태스크의 처리를 정지해, 실행을 대기하고 있던 태스크의 리스트를 돌려줍니다.
protected  void terminated ()
          executor 가 종료되었을 때에 불려 가는 메소드입니다.
 
클래스 java.util.concurrent. AbstractExecutorService 로부터 상속된 메소드
invokeAll , invokeAll , invokeAny , invokeAny , newTaskFor , newTaskFor , submit , submit , submit
 
클래스 java.lang. Object 로부터 상속된 메소드
clone , equals , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
 

생성자 의 상세

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit  unit,
                          BlockingQueue <Runnable > workQueue)
지정된 초기 파라미터, 및 디폴트의 thread 팩토리라고 거부된 실행 핸들러를 사용해, 새로운 ThreadPoolExecutor 를 작성합니다. 이 범용 생성자 은 아니고,Executors 팩토리 메소드의 어느쪽이든을 사용하는 편이 편리한 경우가 있습니다.

파라미터:
corePoolSize - 풀내 로 유지하는 thread의 수 (IDLE 상태의 thread도 포함한다)
maximumPoolSize - 풀내에서 가능한 thread의 최대수
keepAliveTime - thread의 수가 코어보다 많은 경우, 이것은 초과한 IDLE 상태의 thread가 종료전에 새로운 태스크를 대기하는 최대 시간
unit - keepAliveTime 인수의 시간 단위
workQueue - 태스크의 실행전에, 그 태스크를 보관 유지하기 위해서 사용하는 큐. 이 큐는,execute 메소드로 송신된 Runnable 태스크만을 보관 유지한다
예외:
IllegalArgumentException - corePoolSize 또는 keepAliveTime 가 제로보다 작은 경우, maximumPoolSize 가 제로 이하의 경우, 또는 corePoolSize 가 maximumPoolSize 보다 큰 경우
NullPointerException - workQueue 가 null 의 경우

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit  unit,
                          BlockingQueue <Runnable > workQueue,
                          ThreadFactory  threadFactory)
지정된 초기 파라미터, 및 디폴트의 거부된 실행 핸들러를 사용해, 새로운 ThreadPoolExecutor 를 작성합니다.

파라미터:
corePoolSize - 풀내 로 유지하는 thread의 수 (IDLE 상태의 thread도 포함한다)
maximumPoolSize - 풀내에서 가능한 thread의 최대수
keepAliveTime - thread의 수가 코어보다 많은 경우, 이것은 초과한 IDLE 상태의 thread가 종료전에 새로운 태스크를 대기하는 최대 시간
unit - keepAliveTime 인수의 시간 단위
workQueue - 태스크의 실행전에, 그 태스크를 보관 유지하기 위해서 사용하는 큐. 이 큐는,execute 메소드로 송신된 Runnable 태스크만을 보관 유지하는
threadFactory - executor 가 새로운 thread를 작성할 경우에 사용하는 팩토리
예외:
IllegalArgumentException - corePoolSize 또는 keepAliveTime 가 제로보다 작은 경우, maximumPoolSize 가 제로 이하의 경우, 또는 corePoolSize 가 maximumPoolSize 보다 큰 경우
NullPointerException - workQueue 또는 threadFactory 가 null 의 경우

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit  unit,
                          BlockingQueue <Runnable > workQueue,
                          RejectedExecutionHandler  handler)
지정된 초기 파라미터, 및 디폴트의 thread 팩토리를 사용해, 새로운 ThreadPoolExecutor 를 작성합니다.

파라미터:
corePoolSize - 풀내 로 유지하는 thread의 수 (IDLE 상태의 thread도 포함한다)
maximumPoolSize - 풀내에서 가능한 thread의 최대수
keepAliveTime - thread의 수가 코어보다 많은 경우, 이것은 초과한 IDLE 상태의 thread가 종료전에 새로운 태스크를 대기하는 최대 시간
unit - keepAliveTime 인수의 시간 단위
workQueue - 태스크의 실행전에, 그 태스크를 보관 유지하기 위해서 사용하는 큐. 이 큐는,execute 메소드로 송신된 Runnable 태스크만을 보관 유지하는
handler - thread의 경계에 이르러, 큐의 용량에 이르렀기 때문에, 실행이 블록 되었을 때에 사용되는 핸들러
예외:
IllegalArgumentException - corePoolSize 또는 keepAliveTime 가 제로보다 작은 경우, maximumPoolSize 가 제로 이하의 경우, 또는 corePoolSize 가 maximumPoolSize 보다 큰 경우
NullPointerException - workQueue 또는 handler 가 null 의 경우

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit  unit,
                          BlockingQueue <Runnable > workQueue,
                          ThreadFactory  threadFactory,
                          RejectedExecutionHandler  handler)
지정된 초기 파라미터를 사용해, 새로운 ThreadPoolExecutor 를 작성합니다.

파라미터:
corePoolSize - 아이돌이어도 풀내에 유지되는 thread의 수
maximumPoolSize - 풀내에서 가능한 thread의 최대수
keepAliveTime - thread의 수가 코어보다 많은 경우, 이것은 초과한 IDLE 상태의 thread가 새로운 태스크를 대기하고 나서 종료할 때까지의 최대 시간
unit - keepAliveTime 인수의 시간 단위
workQueue - 태스크가 초과할 때까지 보관 유지하기 위해서 사용하는 큐. 이 큐는,execute 메소드로 송신된 Runnable 태스크만을 보관 유지하는
threadFactory - executor 가 새로운 thread를 작성할 경우에 사용되는 팩토리
handler - thread의 경계 및 큐의 용량에 이르렀기 때문에, 실행이 블록 되었을 때에 사용하는 핸들러
예외:
IllegalArgumentException - corePoolSize 또는 keepAliveTime 가 제로보다 작은 경우, maximumPoolSize 가 제로 이하의 경우, 또는 corePoolSize 가 maximumPoolSize 보다 큰 경우
NullPointerException - workQueue,threadFactory, 또는 handler 가 null 의 경우
메소드의 상세

execute

public void execute(Runnable  command)
장래가 있는 시점에서 지정된 태스크를 실행합니다. 태스크는, 새로운 thread 또는 기존의 풀 된 thread로 실행됩니다. 이 executor 가 종료 했기 때문에, 또는 용량에 이르렀기 때문에, 태스크를 송신해 실행할 수 없는 경우, 태스크는 현재의 RejectedExecutionHandler 로 처리됩니다.

파라미터:
command - 실행하는 태스크
예외:
RejectedExecutionException - RejectedExecutionHandler 의 판단으로, 태스크의 실행을 받아들일 수가 없는 경우
NullPointerException - 커멘드가 null 의 경우

shutdown

public void shutdown()
순서 올바르게 종료을 개시합니다. 이전에 송신된 태스크가 실행됩니다만, 신규 태스크는 받아들여지지 않습니다. 종료 후에 호출을 실행해도, 효과는 없습니다.

예외:
SecurityException - 시큐리티 매니저가 존재하는 상황으로 이 ExecutorService 의 종료을 실행하면(자), 호출 측에는 변경을 허가하지 않는 thread를 조작할 수 있는 경우. 이것은,RuntimePermission ("modifyThread") 를 보관 유지하지 않는지, 시큐리티 매니저의 checkAccess 메소드가 액세스를 거부하기 위해(때문에)이다

shutdownNow

public List <Runnable > shutdownNow()
실행중의 액티브한 태스크 모든 정지를 시도해 대기중의 태스크의 처리를 정지해, 실행을 대기하고 있던 태스크의 리스트를 돌려줍니다. 이러한 태스크는, 이 메소드로부터 돌아올 때, 태스크 큐로부터 드레인 (삭제) 됩니다.

실행중의 액티브한 태스크 처리를 정지하기 위해서 최선의 노력을 하는 것 이상의 보증은 없습니다. 이 구현에서는,Thread.interrupt() 를 개입시켜 태스크를 취소하기 (위해)때문에, 인터럽트에 대한 응답에 실패한 태스크는 종료하지 않게 될 가능성이 있습니다.

반환값:
실행이 개시되지 않았던 태스크의 리스트
예외:
SecurityException - 시큐리티 매니저가 존재하는 상황으로 이 ExecutorService 의 종료을 실행하면(자), 호출 측에는 변경을 허가하지 않는 thread를 조작할 수 있는 경우. 이것은,RuntimePermission ("modifyThread") 를 보관 유지하지 않는지, 시큐리티 매니저의 checkAccess 메소드가 액세스를 거부하기 위해(때문에)이다

isShutdown

public boolean isShutdown()
인터페이스 ExecutorService 의 기술:
이 executor 가 종료 하고 있었을 경우,true 를 돌려줍니다.

반환값:
이 executor 가 종료 하고 있었을 경우는 true

isTerminating

public boolean isTerminating()
shutdown 또는 shutdownNow 의 나중에 이 executor 가 종료 처리중이지만, 완전하게 종료하고 있지 않는 경우는, true 를 돌려줍니다. 이 메소드는 디버그에 편리한 일이 있습니다. 종료 후에 충분히 시간이 흐르고 나서 보고된 반환값 true 는, 송신된 태스크가 무시되었는지 인터럽트가 억제되었기 때문에, 이 executor 가 적절히 종료되지 않는 것을 나타낼 가능성이 있습니다.

반환값:
종료중이지만 종료하고 있지 않는 경우는 true

isTerminated

public boolean isTerminated()
인터페이스 ExecutorService 의 기술:
종료에 이어 모든 태스크가 완료하고 있었을 경우,true 를 돌려줍니다. shutdown 또는 shutdownNow 중 한쪽이 isTerminated 의 전에 불려 갔을 경우를 제외해,isTerminatedtrue 가 될 것은 없습니다.

반환값:
종료에 이어 모든 태스크가 완료하고 있었을 경우는 true

awaitTermination

public boolean awaitTermination(long timeout,
                                TimeUnit  unit)
                         throws InterruptedException 
인터페이스 ExecutorService 의 기술:
종료 요구 후에 모든 태스크가 실행을 완료하고 있었는지, 타임 아웃이 발생하는지, 현재의 thread로 인터럽트가 발생하는지, 그 어느쪽이든가 최초로 발생할 때까지 블록 합니다.

파라미터:
timeout - 대기하는 최장 시간
unit - timeout 인수의 시간 단위
반환값:
이 executor 가 종료되었을 경우는 true, 종료전에 타임 아웃이 경과했을 경우는 false
예외:
InterruptedException - 대기중에 인터럽트가 발생했을 경우

finalize

protected void finalize()
이 executor 가 참조되지 않게 되었을 때에 shutdown 를 호출합니다.

오버라이드(override):
클래스 Object 내의 finalize

setThreadFactory

public void setThreadFactory(ThreadFactory  threadFactory)
새로운 thread의 작성에 사용하는 thread 팩토리를 설정합니다.

파라미터:
threadFactory - 새로운 thread 팩토리
예외:
NullPointerException - threadFactory 가 null 의 경우
관련 항목:
getThreadFactory()

getThreadFactory

public ThreadFactory  getThreadFactory()
새로운 thread의 작성에 사용하는 thread 팩토리를 돌려줍니다.

반환값:
현재의 thread 팩토리
관련 항목:
setThreadFactory(java.util.concurrent.ThreadFactory)

setRejectedExecutionHandler

public void setRejectedExecutionHandler(RejectedExecutionHandler  handler)
실행 가능하지 않은 태스크의 새로운 핸들러를 설정합니다.

파라미터:
handler - 새로운 핸들러
예외:
NullPointerException - 핸들러가 null 의 경우
관련 항목:
getRejectedExecutionHandler()

getRejectedExecutionHandler

public RejectedExecutionHandler  getRejectedExecutionHandler()
실행 가능하지 않은 태스크의 현재의 핸들러를 돌려줍니다.

반환값:
현재의 핸들러
관련 항목:
setRejectedExecutionHandler(java.util.concurrent.RejectedExecutionHandler)

setCorePoolSize

public void setCorePoolSize(int corePoolSize)
thread의 코어수를 설정합니다. 이것은, 생성자 으로 설정되는 모든 값을 오버라이드(override) 합니다. 새로운 값이 현재의 값보다 작은 경우, 초과하는 기존의 thread는, 다음의 아이돌시에 종료합니다. 큰 경우는, 필요에 따라서 새로운 thread가 기동해, 큐에 들어가 있는 태스크가 실행됩니다.

파라미터:
corePoolSize - 새로운 코어 사이즈
예외:
IllegalArgumentException - corePoolSize 가 제로보다 작은 경우
관련 항목:
getCorePoolSize()

getCorePoolSize

public int getCorePoolSize()
thread의 코어수를 돌려줍니다.

반환값:
thread의 코어수
관련 항목:
setCorePoolSize(int)

prestartCoreThread

public boolean prestartCoreThread()
코어 thread를 기동해, IDLE 상태로 처리 대기로 합니다. 이것은, 새로운 태스크가 실행될 때 마셔 코어 thread를 기동하는 디폴트 정책를 오버라이드(override) 합니다. 모든 코어 thread가 벌써 기동이 끝난 상태인 경우는,false 를 돌려줍니다.

반환값:
thread가 기동되었을 경우는 true

prestartAllCoreThreads

public int prestartAllCoreThreads()
모든 코어 thread를 기동해, IDLE 상태로 처리 대기로 합니다. 이것은, 새로운 태스크가 실행될 때 마셔 코어 thread를 기동하는 디폴트 정책를 오버라이드(override) 합니다.

반환값:
기동된 thread의 수

allowsCoreThreadTimeOut

public boolean allowsCoreThreadTimeOut()
이 풀에서, keepAlive 시간내에 도착한 태스크가 없으면 코어 thread가 타임 아웃 및 종료하는 것이 허가되어 새로운 태스크가 도착했을 때는 필요에 따라서 코어 thread를 옮겨놓을 수 있는 경우는, true 를 돌려줍니다. true 의 경우는, 코어 thread 이외에 적용되는 것과 같은 킵얼라이브 정책가 코어 thread에도 적용됩니다. false 의 경우는 (디폴트), 착신하는 태스크가 없기 위해(때문에) 코어 thread가 종료할 것은 없습니다.

반환값:
코어 thread로 타임 아웃이 허가되고 있는 경우는 true, 그렇지 않은 경우는 false
도입된 버젼:
1.6

allowCoreThreadTimeOut

public void allowCoreThreadTimeOut(boolean value)
이 풀에서, 킵얼라이브 시간내에 도착한 태스크가 없으면 코어 thread가 타임 아웃 및 종료하는 것이 허가되어 새로운 태스크가 도착했을 때는 필요에 따라서 코어 thread를 옮겨놓을 수 있을지 어떨지를 제어하는 정책를 설정합니다. false 의 경우는, 착신하는 태스크가 없기 위해(때문에) 코어 thread가 종료할 것은 없습니다. true 의 경우는, 코어 thread 이외에 적용되는 것과 같은 킵얼라이브 정책가 코어 thread에도 적용됩니다. 연속적으로 thread를 옮겨놓을 수 없게 하기 위한(해),true 로 설정할 때는, 킵얼라이브 시간을 제로보다 크게 할 필요가 있습니다. 일반적으로은, 이 메소드를 호출하고 나서, 풀을 액티브하게 사용해 주세요.

파라미터:
value - 타임 아웃 하는 경우는 true, 그렇지 않은 경우는 false
예외:
IllegalArgumentException - 치가 true 로, 현재의 킵얼라이브 시간이 제로 이하의 경우
도입된 버젼:
1.6

setMaximumPoolSize

public void setMaximumPoolSize(int maximumPoolSize)
thread의 최대 허용수를 설정합니다. 이것은, 생성자 으로 설정되는 모든 값을 오버라이드(override) 합니다. 새로운 값이 현재의 값보다 작은 경우, 초과하는 기존의 thread는, 다음의 아이돌시에 종료합니다.

파라미터:
maximumPoolSize - 새로운 최대치
예외:
IllegalArgumentException - 새로운 최대치가 제로 이하의 경우, 또는 core pool size 보다 작은 경우
관련 항목:
getMaximumPoolSize()

getMaximumPoolSize

public int getMaximumPoolSize()
thread의 최대 허용수를 돌려줍니다.

반환값:
thread의 최대 허용수
관련 항목:
setMaximumPoolSize(int)

setKeepAliveTime

public void setKeepAliveTime(long time,
                             TimeUnit  unit)
thread가 종료전에 IDLE 상태에 머물 수가 있는 제한 시간을 설정합니다. 현재 풀내에 코어수이상의 thread가 있는 경우는, 태스크를 처리하지 않고 이 시간만 대기하면(자), 초과한 thread는 종료합니다. 이것은, 생성자 으로 설정되는 모든 값을 오버라이드(override) 합니다.

파라미터:
time - 대기하는 시간. time 치가 제로의 경우는, 태스크를 실행하자마자 초과한 thread가 종료하는
unit - time 인수의 시간 단위
예외:
IllegalArgumentException - time 가 제로보다 작은 경우, 또는 time 가 제로로 allowsCoreThreadTimeOut 의 경우
관련 항목:
getKeepAliveTime(java.util.concurrent.TimeUnit)

getKeepAliveTime

public long getKeepAliveTime(TimeUnit  unit)
코어 풀 사이즈를 넘는 thread가 종료전에 IDLE 상태에 머물 수가 있는, thread의 킵얼라이브 시간을 돌려줍니다.

파라미터:
unit - 반환값으로 지정하는 시간 단위
반환값:
제한 시간
관련 항목:
setKeepAliveTime(long, java.util.concurrent.TimeUnit)

getQueue

public BlockingQueue <Runnable > getQueue()
이 executor 로 사용하는 태스크 큐를 돌려줍니다. 태스크 큐에의 액세스는, 디버그 및 감시를 주된 목적으로 하고 있습니다. 이 큐는, 액티브하게 사용되고 있을 가능성이 있습니다. 태스크 큐를 꺼내도, 큐에 들어가 있는 태스크의 실행은 방해할 수 없습니다.

반환값:
태스크 큐

remove

public boolean remove(Runnable  task)
executor 의 내부 큐에 이 태스크가 존재하는 경우는 삭제하기 위해(때문에), 그 태스크가 아직 개시되어 있지 않은 경우는 실행되지 않습니다.

이 메소드는 취소해 방식의 일부로서 편리한 일이 있습니다. 내부 큐에 배치되기 전에 다른 형식에 변환된 태스크는, 삭제에 실패할 가능성이 있습니다. 예를 들어,submit 를 사용해 들어가는 태스크는,Future 상태를 유지하는 형식에 변환되는 일이 있습니다. 다만, 이 경우는,purge() 메소드를 사용해, 삭제된 Future 를 삭제할 수가 있습니다.

파라미터:
task - 삭제하는 태스크
반환값:
태스크가 삭제되었을 경우는 true

purge

public void purge()
삭제된 모든 Future 태스크를 워크 큐로부터 삭제하려고 합니다. 이 메소드는, 기능에 그 외의 영향이 없는, 기억 영역의 재생 오퍼레이션으로서 편리한 일이 있습니다. 삭제된 태스크가 실행될 것은 없습니다만, 워크스 레드가 액티브하게 삭제할 때까지 워크 큐내에 축적되는 경우가 있습니다. 이 메소드를 호출하면(자), 즉시 삭제하려고 합니다. 다만, 그 외의 thread에 의한 간섭이 존재하는 경우는, 이 메소드는 태스크의 삭제에 실패하는 일이 있습니다.


getPoolSize

public int getPoolSize()
풀내의 현재의 thread수를 돌려줍니다.

반환값:
thread수

getActiveCount

public int getActiveCount()
액티브하게 태스크를 실행하고 있는 thread의 대략의 수를 돌려줍니다.

반환값:
thread수

getLargestPoolSize

public int getLargestPoolSize()
풀내에 동시에 존재한 최대 thread수를 돌려줍니다.

반환값:
thread수

getTaskCount

public long getTaskCount()
지금까지 실행이 스케줄 된 태스크의 대략의 총수를 돌려줍니다. 태스크 및 thread 상태는, 계산중에 동적으로 변화하는 일이 있기 (위해)때문에, 반환값은 근사에 지나지 않습니다.

반환값:
태스크수

getCompletedTaskCount

public long getCompletedTaskCount()
지금까지 실행이 완료한 태스크의 대략의 총수를 돌려줍니다. 태스크 및 thread 상태는, 계산중에 동적으로 변화하는 일이 있기 (위해)때문에, 반환값은 근사에 지나지 않습니다만, 연속해 호출해도 감소하지 않습니다.

반환값:
태스크수

beforeExecute

protected void beforeExecute(Thread  t,
                             Runnable  r)
지정된 thread로 지정된 Runnable 를 실행하기 전에 불려 가는 메소드입니다. 이 메소드는, 태스크 r 를 실행하는 thread t 에 의해 불려 가 ThreadLocal 의 재초기화나 로깅의 실행에 사용되는 경우가 있습니다.

이 구현은 처리를 실시하지 않습니다만, 서브 클래스에서 커스터마이즈 하는 것은 가능합니다. 주:복수의 오버라이드(override)를 적절히 상자로 하기 (위해)때문에, 일반적으로은, 서브 클래스에서는 이 메소드의 최후로 super.beforeExecute 를 호출하도록 해 주세요.

파라미터:
t - 태스크 r 를 실행하는 thread
r - 실행되는 태스크

afterExecute

protected void afterExecute(Runnable  r,
                            Throwable  t)
지정된 Runnable 의 실행 완료시에 불려 가는 메소드입니다. 이 메소드는 태스크를 실행한 thread에 의해 불려 갑니다. null 가 아닌 경우, Throwable 는, 실행이 강제 종료되는 원인이 된 캐치 되지 않는 RuntimeException 또는 Error 입니다.

주: 액션이 명시적으로, 또는 submit 등의 메소드에 의해, 태스크 (FutureTask 등) 내에 들어가는 경우, 이러한 태스크 객체는 계산의 예외를 캐치 해 유지합니다. 그 때문에, 이상종료(ABEND) 할 것은 없고, 내부 예외는 이 메소드에게 건네지지 않습니다.

이 구현은 처리를 실시하지 않습니다만, 서브 클래스에서 커스터마이즈 하는 것은 가능합니다. 주:복수의 오버라이드(override)를 적절히 상자로 하기 (위해)때문에, 일반적으로, 서브 클래스에서는 이 메소드의 최초로 super.afterExecute 를 호출하도록 해 주세요.

파라미터:
r - 완료한 Runnable
t - 종료의 원인이 된 예외, 또는 실행이 정상적으로 완료했을 경우는 null

terminated

protected void terminated()
executor 가 종료되었을 때에 불려 가는 메소드입니다. 디폴트의 구현은 처리를 실시하지 않습니다. 주:복수의 오버라이드(override)를 적절히 상자로 하기 (위해)때문에, 일반적으로, 서브 클래스에서는 이 메소드내에서 super.terminated 를 호출하도록 해 주세요.


JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.