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

プールされた複数のスレッドの 1 つを使用して送信された各タスクを実行する ExecutorService です。通常は Executors ファクトリメソッドを使用して構成されます。  

スレッドプールでは、2 つの問題に対処します。まず、タスクあたりの呼び出しオーバーヘッドが減少するため、通常は大量の非同期タスクの実行時にパフォーマンスが向上します。また、タスクのコレクションを実行するときに消費されるリソース (スレッドを含む) の境界設定および管理のための方法を提供します。各 ThreadPoolExecutor も基本的な統計情報 (完了したタスクの数など) を保持します。  

幅広いコンテキストで有用であるために、このクラスでは多くの調整可能なパラメータや拡張性フックを提供します。ただしプログラマは、より便利な Executors ファクトリメソッドである Executors.newCachedThreadPool() (自動スレッド再生のあるアンバウンド形式のスレッドプール)、Executors.newFixedThreadPool(int) (固定サイズのスレッドプール)、および Executors.newSingleThreadExecutor() (単一バックグラウンドのスレッド) を使用してください。これらのファクトリメソッドは、もっとも一般的な使用を想定した設定を事前設定します。そうでない場合、このクラスを手動で設定し調整するときは次のガイドに従ってください。

コアおよび最大プールサイズ
corePoolSize (getCorePoolSize() を参照) と maximumPoolSize (getMaximumPoolSize() を参照) で設定された境界に従って、ThreadPoolExecutor は自動的にプールサイズを調整します (getPoolSize() を参照)。新しいタスクが execute(java.lang.Runnable) メソッドで送信され、corePoolSize よりも少ない数のスレッドが実行中である場合は、その他のワークスレッドがアイドル状態であっても、要求を処理するために新しいスレッドが作成されます。corePoolSize よりも多く、maximumPoolSize よりも少ない数のスレッドが実行中である場合、新しいスレッドが作成されるのはキューがいっぱいである場合だけです。corePoolSize と maximumPoolSize を同じ値に設定すると、固定サイズのスレッドプールが作成されます。maximumPoolSize を Integer.MAX_VALUE などの実質的にアンバウンド形式である値に設定すると、プールに任意の数の並行タスクを格納することができます。コアプールサイズと最大プールサイズは構築時にのみ設定されるのがもっとも一般的ですが、setCorePoolSize(int) および setMaximumPoolSize(int) を使用して動的に変更することもできます。
オンデマンド構築
デフォルトでは、新しいタスクの到着時にのみコアスレッドがはじめて作成されて起動されますが、prestartCoreThread() または prestartAllCoreThreads() メソッドを使用して動的にオーバーライドできます。空でないキューでプールを構築する場合は、スレッドを事前に起動することもできます。
新しいスレッドの作成
新しいスレッドは ThreadFactory を使用して作成されます。特に指定がない場合は、Executors.defaultThreadFactory() が使用されます。この場合に作成されるスレッドは、すべて同じ ThreadGroup 内にあり、同じ NORM_PRIORITY 優先順位と非デーモン状態を持ちます。異なる ThreadFactory を指定すると、スレッドの名前、スレッドグループ、優先順位、デーモン状態などを変更できます。要求時に newThread から null が返されて ThreadFactory がスレッドの作成に失敗すると、executor は続行しますが、タスクをまったく実行できない可能性があります。
キープアライブ時間
現在プールに corePoolSize の数よりも多くのスレッドがある場合、超過した分のスレッドは、アイドル状態になっている期間が keepAliveTime を越えると終了します (getKeepAliveTime(java.util.concurrent.TimeUnit) を参照)。これにより、プールがアクティブに使用されていないときのリソースの消費量を減らすことができます。プールがあとでアクティブになると、新しいスレッドが構築されます。このパラメータは、setKeepAliveTime(long, java.util.concurrent.TimeUnit) メソッドを使用して動的に変更できます。Long.MAX_VALUE TimeUnit.NANOSECONDS の値を使用すると、アイドルスレッドがシャットダウン前に終了することも実質的に無効になります。デフォルトでは、corePoolSizeThreads を越える場合にのみキープアライブポリシーを適用します。ただし keepAliveTime の値がゼロ以外であれば、allowCoreThreadTimeOut(boolean) メソッドを使用して、このタイムアウトポリシーをコアスレッドにも適用することができます。
キューイング
BlockingQueue は、送信されたタスクを転送および保持するために使用できます。このキューの使用は、プールのサイズ設定と相互に作用します。 キューイングの一般的な方式には次の 3 種類があります。
  1. 直接ハンドオフ。ワークキューに適したデフォルトの選択肢は、タスクを保持しないでスレッドにハンドオフする SynchronousQueue です。SynchronousQueue は、本来はタスクを保持します。この場合、タスクを実行するためにすぐに利用できるスレッドがないと、タスクをキューに入れようとしたときに失敗し、新しいスレッドが構築されます。このポリシーにより、内部的な依存関係を持つ可能性がある要求セットの処理時にロックアップが回避されます。一般に直接ハンドオフでは、送信された新しいタスクが拒否されるのを回避するために、アンバウンド形式の maximumPoolSizes が必要です。これにより、平均して処理能力を超える速さでコマンドが次々に到着すると、アンバウンド形式のスレッドが大きくなる可能性があります。
  2. アンバウンド形式のキュー。アンバウンド形式のキュー (事前定義された容量を持たない LinkedBlockingQueue など) を使用すると、corePoolSize のすべてのスレッドがビジー状態である場合に、新しいタスクはキュー内で待機します。これにより、corePoolSize を越えるスレッドは作成されなくなります。つまり maximumPoolSize の値は効果がなくなります。各タスクが完全に独立しているため、タスクが相互の実行に影響しない場合はこの方式が適切であることがあります (Web ページサーバーの場合など)。この方式のキューイングは、一時的に急増した要求を処理する場合などは便利ですが、平均して処理能力を超える速さでコマンドが次々に到着すると、アンバウンド形式のワークキューが大きくなる可能性があります。
  3. バウンド形式のキュー。バウンド形式のキュー (ArrayBlockingQueue など) は、限定された maximumPoolSizes で使用するとリソース不足を回避できますが、調整と制御が難しくなる可能性があります。キューサイズと最大プールサイズは互いにトレードオフの関係になることがあります。大きなキューと小さなプールを使用すると、CPU 使用率、OS リソース量、およびコンテキストスイッチングのオーバーヘッドは最小化されますが、スループットは大幅に低下する可能性があります。タスクが頻繁にブロックする場合は (入出力が制限される場合など)、許可しているスレッド数よりも多くのスレッドに対して、システムが時間をスケジュールすることができます。小さいキューを使用すると、一般に必要なプールサイズは大きくなります。これにより、CPU がよりビジーになりますが、過大なスケジュール設定のオーバーヘッドが発生することがあり、スループットも低下します。
拒否されたタスク
executor がシャットダウンしている場合、または executor が最大スレッド数とワークキュー容量の両方で有限の境界を使用し、かつ飽和状態である場合、execute(java.lang.Runnable) メソッドで送信された新しいタスクは拒否されます。どちらの場合も、execute メソッドは、RejectedExecutionHandlerRejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) メソッドを呼び出します。事前定義された 4 つのハンドラポリシーが用意されています。
  1. デフォルトの ThreadPoolExecutor.AbortPolicy では、拒否されると、ハンドラは実行時の RejectedExecutionException をスローします。
  2. ThreadPoolExecutor.CallerRunsPolicy では、execute 自体を呼び出すスレッドがタスクを実行します。これにより、単純なフィードバック制御機構が提供され、結果として新しいタスクの送信レートが低下します。
  3. ThreadPoolExecutor.DiscardPolicy では、実行できないタスクが単に削除されます。
  4. ThreadPoolExecutor.DiscardOldestPolicy では、executor がシャットダウンしていない場合は、ワークキューの先頭にあるタスクが削除され、実行が再試行されます (もう一度失敗する可能性があり、その場合はこの処理が繰り返される)。
ほかの種類の RejectedExecutionHandler クラスを定義および使用することもできます。その場合、特定の容量またはキューイングポリシーでのみ動作するようにポリシーが設計されているときは、特に注意が必要です。
フックメソッド
このクラスは、protected のオーバーライド可能な beforeExecute(java.lang.Thread, java.lang.Runnable) メソッドと afterExecute(java.lang.Runnable, java.lang.Throwable) メソッドを提供しています。これらのメソッドは、各タスクを実行する前後に呼び出されます。これらのメソッドは、実行環境を操作するために使用できます (ThreadLocal の再初期化、統計情報の収集、ログエントリの追加など)。また、executor が完全に終了したら実行する必要のある特別な処理を実行するように、terminated() メソッドをオーバーライドすることができます。  

フックまたはコールバックメソッドが例外をスローすると、内部のワークスレッドは失敗して強制終了します。

キューの保守
getQueue() メソッドを使用すると、監視やデバッグの目的でワークキューにアクセスできます。その他の目的でこのメソッドを使用しないことが強く推奨されています。提供される 2 つのメソッド remove(java.lang.Runnable) および purge() は、キューに入っている大量のタスクが取り消されるときに、記憶領域の再生を支援するために利用できます。
ファイナライズ
プールがプログラムで参照されなくなり、かつ残っているスレッドがなくなると、そのプールで自動的に shutdown が実行されます。ユーザーが shutdown() の呼び出しを忘れたときでも、参照されていないプールが再生されるようにする場合は、未使用のスレッドが最終的に終了するように設定する必要があります。それには、適切なキープアライブ時間を設定したり、ゼロコアスレッドの下限を使用したり、allowCoreThreadTimeOut(boolean) を設定したりします。
 

拡張機能の例。このクラスのほとんどの拡張機能は、1 つ以上の protected フックメソッドをオーバーライドします。たとえば、次の例は、単純な一時停止および再開の機能を追加するサブクラスです。  

 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 をスローする拒否されたタスクのハンドラです。
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)
          指定された初期パラメータ、およびデフォルトのスレッドファクトリと拒否された実行ハンドラを使用して、新しい ThreadPoolExecutor を作成します。
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
          指定された初期パラメータ、およびデフォルトのスレッドファクトリを使用して、新しい 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)
          このプールで、キープアライブ時間内に到着したタスクがなければコアスレッドがタイムアウトおよび終了することが許可され、新しいタスクが到着したときは必要に応じてコアスレッドが置き換えられるかどうかを制御するポリシーを設定します。
 boolean allowsCoreThreadTimeOut()
          このプールで、keepAlive 時間内に到着したタスクがなければコアスレッドがタイムアウトおよび終了することが許可され、新しいタスクが到着したときは必要に応じてコアスレッドが置き換えられる場合は、true を返します。
 boolean awaitTermination(long timeout, TimeUnit unit)
          シャットダウン要求後にすべてのタスクが実行を完了していたか、タイムアウトが発生するか、現在のスレッドで割り込みが発生するか、そのいずれかが最初に発生するまでブロックします。
protected  void beforeExecute(Thread t, Runnable r)
          指定されたスレッドで指定された Runnable を実行する前に呼び出されるメソッドです。
 void execute(Runnable command)
          将来のある時点で指定されたタスクを実行します。
protected  void finalize()
          この executor が参照されなくなったときに shutdown を呼び出します。
 int getActiveCount()
          アクティブにタスクを実行しているスレッドのおよその数を返します。
 long getCompletedTaskCount()
          これまでに実行が完了したタスクのおよその総数を返します。
 int getCorePoolSize()
          スレッドのコア数を返します。
 long getKeepAliveTime(TimeUnit unit)
          コアプールサイズを超えるスレッドが終了前にアイドル状態に留まることができる、スレッドのキープアライブ時間を返します。
 int getLargestPoolSize()
          プール内に同時に存在した最大スレッド数を返します。
 int getMaximumPoolSize()
          スレッドの最大許容数を返します。
 int getPoolSize()
          プール内の現在のスレッド数を返します。
 BlockingQueue<Runnable> getQueue()
          この executor で使用するタスクキューを返します。
 RejectedExecutionHandler getRejectedExecutionHandler()
          実行可能でないタスクの現在のハンドラを返します。
 long getTaskCount()
          これまでに実行がスケジュールされたタスクのおよその総数を返します。
 ThreadFactory getThreadFactory()
          新しいスレッドの作成に使用するスレッドファクトリを返します。
 boolean isShutdown()
          この executor がシャットダウンしていた場合、true を返します。
 boolean isTerminated()
          シャットダウンに続いてすべてのタスクが完了していた場合、true を返します。
 boolean isTerminating()
          shutdown または shutdownNow のあとでこの executor が終了処理中だが、完全に終了していない場合は、true を返します。
 int prestartAllCoreThreads()
          すべてのコアスレッドを起動し、アイドル状態で処理待ちにします。
 boolean prestartCoreThread()
          コアスレッドを起動し、アイドル状態で処理待ちにします。
 void purge()
          取り消されたすべての Future タスクをワークキューから削除しようとします。
 boolean remove(Runnable task)
          executor の内部キューにこのタスクが存在する場合は削除するため、そのタスクがまだ開始されていない場合は実行されません。
 void setCorePoolSize(int corePoolSize)
          スレッドのコア数を設定します。
 void setKeepAliveTime(long time, TimeUnit unit)
          スレッドが終了前にアイドル状態に留まることができる制限時間を設定します。
 void setMaximumPoolSize(int maximumPoolSize)
          スレッドの最大許容数を設定します。
 void setRejectedExecutionHandler(RejectedExecutionHandler handler)
          実行可能でないタスクの新しいハンドラを設定します。
 void setThreadFactory(ThreadFactory threadFactory)
          新しいスレッドの作成に使用するスレッドファクトリを設定します。
 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)
指定された初期パラメータ、およびデフォルトのスレッドファクトリと拒否された実行ハンドラを使用して、新しい ThreadPoolExecutor を作成します。この汎用コンストラクタではなく、Executors ファクトリメソッドのいずれかを使用するほうが便利な場合があります。

パラメータ:
corePoolSize - アイドルであってもプール内に維持されるスレッドの数
maximumPoolSize - プール内で可能なスレッドの最大数
keepAliveTime - スレッドの数がコアよりも多い場合、これは超過したアイドル状態のスレッドが新しいタスクを待機してから終了するまでの最大時間
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 - アイドルであってもプール内に維持されるスレッドの数
maximumPoolSize - プール内で可能なスレッドの最大数
keepAliveTime - スレッドの数がコアよりも多い場合、これは超過したアイドル状態のスレッドが新しいタスクを待機してから終了するまでの最大時間
unit - keepAliveTime 引数の時間単位
workQueue - タスクが超過するまで保持するために使用するキュー。このキューは、execute メソッドで送信された Runnable タスクだけを保持する
threadFactory - executor が新しいスレッドを作成するときに使用されるファクトリ
例外:
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)
指定された初期パラメータ、およびデフォルトのスレッドファクトリを使用して、新しい ThreadPoolExecutor を作成します。

パラメータ:
corePoolSize - アイドルであってもプール内に維持されるスレッドの数
maximumPoolSize - プール内で可能なスレッドの最大数
keepAliveTime - スレッドの数がコアよりも多い場合、これは超過したアイドル状態のスレッドが新しいタスクを待機してから終了するまでの最大時間
unit - keepAliveTime 引数の時間単位
workQueue - タスクが超過するまで保持するために使用するキュー。このキューは、execute メソッドで送信された Runnable タスクだけを保持する
handler - スレッドの境界に達し、キューの容量に達したため、実行がブロックされたときに使用されるハンドラ
例外:
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 - アイドルであってもプール内に維持されるスレッドの数
maximumPoolSize - プール内で可能なスレッドの最大数
keepAliveTime - スレッドの数がコアよりも多い場合、これは超過したアイドル状態のスレッドが新しいタスクを待機してから終了するまでの最大時間
unit - keepAliveTime 引数の時間単位
workQueue - タスクが超過するまで保持するために使用するキュー。このキューは、execute メソッドで送信された Runnable タスクだけを保持する
threadFactory - executor が新しいスレッドを作成するときに使用されるファクトリ
handler - スレッドの境界に達し、キューの容量に達したため、実行がブロックされたときに使用されるハンドラ
例外:
IllegalArgumentException - corePoolSize または keepAliveTime がゼロよりも小さい場合、maximumPoolSize がゼロ以下の場合、または corePoolSize が maximumPoolSize よりも大きい場合
NullPointerException - workQueuethreadFactory、または handler が null の場合
メソッドの詳細

execute

public void execute(Runnable command)
将来のある時点で指定されたタスクを実行します。タスクは、新しいスレッドまたは既存のプールされたスレッドで実行されます。 この executor がシャットダウンしたため、または容量に達したために、タスクを送信して実行できない場合、タスクは現在の RejectedExecutionHandler で処理されます。

パラメータ:
command - 実行するタスク
例外:
RejectedExecutionException - RejectedExecutionHandler の判断で、タスクの実行を受け入れることができない場合
NullPointerException - コマンドが null の場合

shutdown

public void shutdown()
順序正しくシャットダウンを開始します。以前に送信されたタスクが実行されますが、新規タスクは受け入れられません。シャットダウン後に呼び出しを実行しても、効果はありません。

例外:
SecurityException - セキュリティーマネージャーが存在する状況でこの ExecutorService のシャットダウンを実行すると、呼び出し側には変更を許可しないスレッドを操作できる場合。これは、RuntimePermission("modifyThread") を保持しないか、セキュリティーマネージャーの checkAccess メソッドがアクセスを拒否するためである

shutdownNow

public List<Runnable> shutdownNow()
実行中のアクティブなタスクすべての停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。これらのタスクは、このメソッドから戻るときに、タスクキューからドレイン (削除) されます。  

実行中のアクティブなタスク処理を停止するために最善の努力をすること以上の保証はありません。この実装では、Thread.interrupt() を介してタスクを取り消すため、割り込みに対する応答に失敗したタスクは終了しなくなる可能性があります。

戻り値:
実行が開始されなかったタスクのリスト
例外:
SecurityException - セキュリティーマネージャーが存在する状況でこの ExecutorService のシャットダウンを実行すると、呼び出し側には変更を許可しないスレッドを操作できる場合。これは、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 の記述:
シャットダウン要求後にすべてのタスクが実行を完了していたか、タイムアウトが発生するか、現在のスレッドで割り込みが発生するか、そのいずれかが最初に発生するまでブロックします。

パラメータ:
timeout - 待機する最長時間
unit - timeout 引数の時間単位
戻り値:
この executor が終了した場合は true、終了前にタイムアウトが経過した場合は false
例外:
InterruptedException - 待機中に割り込みが発生した場合

finalize

protected void finalize()
この executor が参照されなくなったときに shutdown を呼び出します。

オーバーライド:
クラス Object 内の finalize

setThreadFactory

public void setThreadFactory(ThreadFactory threadFactory)
新しいスレッドの作成に使用するスレッドファクトリを設定します。

パラメータ:
threadFactory - 新しいスレッドファクトリ
例外:
NullPointerException - threadFactory が null の場合
関連項目:
getThreadFactory()

getThreadFactory

public ThreadFactory getThreadFactory()
新しいスレッドの作成に使用するスレッドファクトリを返します。

戻り値:
現在のスレッドファクトリ
関連項目:
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)
スレッドのコア数を設定します。これは、コンストラクタで設定されるあらゆる値をオーバーライドします。新しい値が現在の値より小さい場合、超過する既存のスレッドは、次のアイドル時に終了します。大きい場合は、必要に応じて新しいスレッドが起動し、キューに入っているタスクが実行されます。

パラメータ:
corePoolSize - 新しいコアサイズ
例外:
IllegalArgumentException - corePoolSize がゼロより小さい場合
関連項目:
getCorePoolSize()

getCorePoolSize

public int getCorePoolSize()
スレッドのコア数を返します。

戻り値:
スレッドのコア数
関連項目:
setCorePoolSize(int)

prestartCoreThread

public boolean prestartCoreThread()
コアスレッドを起動し、アイドル状態で処理待ちにします。これは、新しいタスクが実行されるときにのみコアスレッドを起動するデフォルトポリシーをオーバーライドします。すべてのコアスレッドがすでに起動済みである場合は、false を返します。

戻り値:
スレッドが起動された場合は true

prestartAllCoreThreads

public int prestartAllCoreThreads()
すべてのコアスレッドを起動し、アイドル状態で処理待ちにします。これは、新しいタスクが実行されるときにのみコアスレッドを起動するデフォルトポリシーをオーバーライドします。

戻り値:
起動されたスレッドの数

allowsCoreThreadTimeOut

public boolean allowsCoreThreadTimeOut()
このプールで、keepAlive 時間内に到着したタスクがなければコアスレッドがタイムアウトおよび終了することが許可され、新しいタスクが到着したときは必要に応じてコアスレッドが置き換えられる場合は、true を返します。true の場合は、コアスレッド以外に適用されるのと同じキープアライブポリシーがコアスレッドにも適用されます。false の場合は (デフォルト)、着信するタスクがないためにコアスレッドが終了することはありません。

戻り値:
コアスレッドでタイムアウトが許可されている場合は true、そうでない場合は false
導入されたバージョン:
1.6

allowCoreThreadTimeOut

public void allowCoreThreadTimeOut(boolean value)
このプールで、キープアライブ時間内に到着したタスクがなければコアスレッドがタイムアウトおよび終了することが許可され、新しいタスクが到着したときは必要に応じてコアスレッドが置き換えられるかどうかを制御するポリシーを設定します。false の場合は、着信するタスクがないためにコアスレッドが終了することはありません。true の場合は、コアスレッド以外に適用されるのと同じキープアライブポリシーがコアスレッドにも適用されます。連続的にスレッドが置き換えられないようにするため、true に設定するときは、キープアライブ時間をゼロよりも大きくする必要があります。通常は、このメソッドを呼び出してから、プールをアクティブに使用してください。

パラメータ:
value - タイムアウトする場合は true、そうでない場合は false
例外:
IllegalArgumentException - 値が true で、現在のキープアライブ時間がゼロ以下の場合
導入されたバージョン:
1.6

setMaximumPoolSize

public void setMaximumPoolSize(int maximumPoolSize)
スレッドの最大許容数を設定します。これは、コンストラクタで設定されるあらゆる値をオーバーライドします。新しい値が現在の値より小さい場合、超過する既存のスレッドは、次のアイドル時に終了します。

パラメータ:
maximumPoolSize - 新しい最大値
例外:
IllegalArgumentException - 新しい最大値がゼロ以下の場合、または core pool size より小さい場合
関連項目:
getMaximumPoolSize()

getMaximumPoolSize

public int getMaximumPoolSize()
スレッドの最大許容数を返します。

戻り値:
スレッドの最大許容数
関連項目:
setMaximumPoolSize(int)

setKeepAliveTime

public void setKeepAliveTime(long time,
                             TimeUnit unit)
スレッドが終了前にアイドル状態に留まることができる制限時間を設定します。現在プール内にコア数以上のスレッドがある場合は、タスクを処理せずにこの時間だけ待機すると、超過したスレッドは終了します。これは、コンストラクタで設定されるあらゆる値をオーバーライドします。

パラメータ:
time - 待機する時間。time 値がゼロの場合は、タスクを実行するとすぐに超過したスレッドが終了する
unit - time 引数の時間単位
例外:
IllegalArgumentException - time がゼロより小さい場合、または time がゼロで allowsCoreThreadTimeOut の場合
関連項目:
getKeepAliveTime(java.util.concurrent.TimeUnit)

getKeepAliveTime

public long getKeepAliveTime(TimeUnit unit)
コアプールサイズを超えるスレッドが終了前にアイドル状態に留まることができる、スレッドのキープアライブ時間を返します。

パラメータ:
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 タスクをワークキューから削除しようとします。このメソッドは、機能にその他の影響のない、記憶領域の再生オペレーションとして便利なことがあります。取り消されたタスクが実行されることはありませんが、ワークスレッドがアクティブに削除するまでワークキュー内に蓄積される場合があります。このメソッドを呼び出すと、ただちに削除しようとします。ただし、その他のスレッドによる干渉が存在する場合は、このメソッドはタスクの削除に失敗することがあります。


getPoolSize

public int getPoolSize()
プール内の現在のスレッド数を返します。

戻り値:
スレッド数

getActiveCount

public int getActiveCount()
アクティブにタスクを実行しているスレッドのおよその数を返します。

戻り値:
スレッド数

getLargestPoolSize

public int getLargestPoolSize()
プール内に同時に存在した最大スレッド数を返します。

戻り値:
スレッド数

getTaskCount

public long getTaskCount()
これまでに実行がスケジュールされたタスクのおよその総数を返します。タスクおよびスレッドの状態は、計算中に動的に変化することがあるため、戻り値は近似にすぎません。

戻り値:
タスク数

getCompletedTaskCount

public long getCompletedTaskCount()
これまでに実行が完了したタスクのおよその総数を返します。タスクおよびスレッドの状態は、計算中に動的に変化することがあるため、戻り値は近似にすぎませんが、連続して呼び出しても減少しません。

戻り値:
タスク数

beforeExecute

protected void beforeExecute(Thread t,
                             Runnable r)
指定されたスレッドで指定された Runnable を実行する前に呼び出されるメソッドです。このメソッドは、タスク r を実行するスレッド t によって呼び出され、ThreadLocal の再初期化やロギングの実行に使用される場合があります。  

この実装は処理を行いませんが、サブクラスでカスタマイズすることは可能です。注:複数のオーバーライドを適切に入れ子にするため、通常は、サブクラスではこのメソッドの最後で super.beforeExecute を呼び出すようにしてください。

パラメータ:
t - タスク r を実行するスレッド
r - 実行されるタスク

afterExecute

protected void afterExecute(Runnable r,
                            Throwable t)
指定された Runnable の実行完了時に呼び出されるメソッドです。このメソッドはタスクを実行したスレッドにより呼び出されます。null でない場合、Throwable は、実行が強制終了される原因となったキャッチされない RuntimeException または Error です。  

注: アクションが明示的に、または submit などのメソッドによって、タスク (FutureTask など) 内に収まる場合、これらのタスクオブジェクトは計算の例外をキャッチして維持します。そのため、異常終了することはなく、内部例外はこのメソッドに渡されません。  

この実装は処理を行いませんが、サブクラスでカスタマイズすることは可能です。注:複数のオーバーライドを適切に入れ子にするため、通常、サブクラスではこのメソッドの最初で super.afterExecute を呼び出すようにしてください。

パラメータ:
r - 完了した Runnable
t - 終了の原因となった例外、または実行が正常に完了した場合は null

terminated

protected void terminated()
executor が終了したときに呼び出されるメソッドです。デフォルトの実装は処理を行いません。注:複数のオーバーライドを適切に入れ子にするため、通常、サブクラスではこのメソッド内で super.terminated を呼び出すようにしてください。


JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。