モジュール java.base
パッケージ 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() (単一バックグラウンドのスレッド)を使用してください。これらのファクトリ・メソッドは、もっとも一般的な使用を想定した設定を事前構成します。 そうでない場合、このクラスを手動で設定し調整するときは次のガイドに従ってください。

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

フック、コールバック、またはBlockingQueueメソッドが例外をスローすると、内部ワーカー・スレッドが失敗し、突然終了し、場合によっては置換される可能性があります。

キューの保守
getQueue()メソッドを使用すると、監視やデバッグの目的でワーク・キューにアクセスできます。 その他の目的でこのメソッドを使用しないことが強く推奨されています。 提供される2つのメソッドremove(Runnable)purge()は、キューに入れられた多数のタスクが取り消されるときに、ストレージの再生を支援するために使用できます。
お薦め
プログラムで参照されなくなったプールで、残りのスレッドがない場合、明示的にシャットダウンしなくても、メモリーの再利用が可能です。 0のコア・スレッドの下限を設定し、または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 
    RejectedExecutionExceptionをスローする拒否されたタスクのハンドラです。
    static class 
    executorがシャットダウンしていない場合に、executeメソッドの呼出しスレッド内で、拒否されたタスクを直接実行する、拒否されたタスクのハンドラです。シャットダウンしている場合、タスクは破棄されます。
    static class 
    executorがシャットダウンしていない場合に、もっとも古い未処理の要求を破棄してexecuteを再試行する、拒否されたタスクのハンドラです。シャットダウンしている場合、タスクは破棄されます。
    static class 
    拒否されたタスクを通知なしで破棄する拒否されたタスクのハンドラです。
  • コンストラクタのサマリー

    コンストラクタ
    コンストラクタ
    説明
    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
    指定されたRunnableの実行完了時に呼び出されるメソッドです。
    void
    allowCoreThreadTimeOut(boolean value)
    このプールで、キープアライブ時間内に到着したタスクがなければコア・スレッドがタイム・アウトおよび終了することが許可され、新しいタスクが到着したときは必要に応じてコア・スレッドが置き換えられるかどうかを制御するポリシーを設定します。
    boolean
    このプールで、keepAlive時間内に到着したタスクがなければコア・スレッドがタイム・アウトおよび終了することが許可され、新しいタスクが到着したときは必要に応じてコア・スレッドが置き換えられる場合は、trueを返します。
    boolean
    awaitTermination(long timeout, TimeUnit unit)
    シャットダウン要求後にすべてのタスクが実行を完了していたか、タイム・アウトが発生するか、現在のスレッドで割込みが発生するか、そのいずれかが最初に発生するまでブロックします。
    protected void
    指定されたスレッドで指定されたRunnableを実行する前に呼び出されるメソッドです。
    void
    execute(Runnable command)
    将来のある時点で指定されたタスクを実行します。
    protected void
    削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。
    最終決定は削除のために非推奨になりました。
    int
    アクティブにタスクを実行しているスレッドのおよその数を返します。
    long
    これまでに実行が完了したタスクのおよその総数を返します。
    int
    スレッドのコア数を返します。
    long
    スレッドが終了する前にアイドル状態のままになる可能性があるスレッドのキープアライブ時間を返します。
    int
    プール内に同時に存在した最大スレッド数を返します。
    int
    スレッドの最大許容数を返します。
    int
    プール内の現在のスレッド数を返します。
    このexecutorで使用するタスク・キューを返します。
    実行可能でないタスクの現在のハンドラを返します。
    long
    これまでに実行がスケジュールされたタスクのおよその総数を返します。
    新しいスレッドの作成に使用するスレッド・ファクトリを返します。
    boolean
    このexecutorがシャットダウンしていた場合、trueを返します。
    boolean
    シャットダウンに続いてすべてのタスクが完了していた場合、trueを返します。
    boolean
    shutdown()またはshutdownNow()のあとでこのexecutorが終了処理中だが、完全に終了していない場合は、trueを返します。
    int
    すべてのコア・スレッドを起動し、アイドル状態で処理待ちにします。
    boolean
    コア・スレッドを起動し、アイドル状態で処理待ちにします。
    void
    取り消されたすべてのFutureタスクをワーク・キューから削除しようとします。
    boolean
    executorの内部キューにこのタスクが存在する場合は削除するため、そのタスクがまだ開始されていない場合は実行されません。
    void
    setCorePoolSize(int corePoolSize)
    スレッドのコア数を設定します。
    void
    setKeepAliveTime(long time, TimeUnit unit)
    スレッドが終了する前にアイドル状態を維持する可能性がある時間を示すスレッド・キープアライブ時間を設定します。
    void
    setMaximumPoolSize(int maximumPoolSize)
    スレッドの最大許容数を設定します。
    void
    実行可能でないタスクの新しいハンドラを設定します。
    void
    新しいスレッドの作成に使用するスレッド・ファクトリを設定します。
    void
    順序正しくシャットダウンを開始します。以前に送信されたタスクが実行されますが、新規タスクは受け入れられません。
    実行中のアクティブなタスクすべての停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。
    protected void
    executorが終了したときに呼び出されるメソッドです。
    実行状態および推定のワーカーおよびタスク・カウントの指示を含めて、このプールおよびその状態を識別する文字列を返します。

    クラス java.util.concurrent.AbstractExecutorServiceで宣言されたメソッド

    invokeAll, invokeAll, invokeAny, invokeAny, newTaskFor, newTaskFor, submit, submit, submit

    クラス java.lang.Objectで宣言されたメソッド

    clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
  • コンストラクタの詳細

    • ThreadPoolExecutor

      public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
      指定された初期パラメータ「デフォルトのスレッド・ファクトリ」および「既定の拒否された実行ハンドラ」を使用して、新しいThreadPoolExecutorを作成します。

      この汎用コンストラクタの代わりに、Executorsファクトリ・メソッドのいずれかを使用する方が便利な場合があります。

      パラメータ:
      corePoolSize - allowCoreThreadTimeOutが設定されていないかぎり、アイドルであってもプール内に維持されるスレッドの数
      maximumPoolSize - プール内で可能なスレッドの最大数
      keepAliveTime - スレッドの数がコアよりも多い場合、これは超過したアイドル状態のスレッドが新しいタスクを待機してから終了するまでの最大時間。
      unit - keepAliveTime引数の時間単位
      workQueue - タスクが実行されるまで保持するために使用するキュー。 このキューは、executeメソッドで送信されたRunnableタスクだけを保持する。
      例外:
      IllegalArgumentException - 次のいずれかが当てはまる場合。
      corePoolSize < 0
      keepAliveTime < 0
      maximumPoolSize <= 0
      maximumPoolSize < corePoolSize
      NullPointerException - workQueueがnullである場合
    • ThreadPoolExecutor

      public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
      指定された初期パラメータと「既定の拒否された実行ハンドラ」を使用して、新しいThreadPoolExecutorを作成します。
      パラメータ:
      corePoolSize - allowCoreThreadTimeOutが設定されていないかぎり、アイドルであってもプール内に維持されるスレッドの数
      maximumPoolSize - プール内で可能なスレッドの最大数
      keepAliveTime - スレッドの数がコアよりも多い場合、これは超過したアイドル状態のスレッドが新しいタスクを待機してから終了するまでの最大時間。
      unit - keepAliveTime引数の時間単位
      workQueue - タスクが実行されるまで保持するために使用するキュー。 このキューは、executeメソッドで送信されたRunnableタスクだけを保持する。
      threadFactory - executorが新しいスレッドを作成するときに使用するファクトリ
      例外:
      IllegalArgumentException - 次のいずれかが当てはまる場合。
      corePoolSize < 0
      keepAliveTime < 0
      maximumPoolSize <= 0
      maximumPoolSize < corePoolSize
      NullPointerException - workQueueまたはthreadFactoryがnullの場合
    • ThreadPoolExecutor

      public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
      指定された初期パラメータと「デフォルトのスレッド・ファクトリ」を使用して、新しいThreadPoolExecutorを作成します。
      パラメータ:
      corePoolSize - allowCoreThreadTimeOutが設定されていないかぎり、アイドルであってもプール内に維持されるスレッドの数
      maximumPoolSize - プール内で可能なスレッドの最大数
      keepAliveTime - スレッドの数がコアよりも多い場合、これは超過したアイドル状態のスレッドが新しいタスクを待機してから終了するまでの最大時間。
      unit - keepAliveTime引数の時間単位
      workQueue - タスクが実行されるまで保持するために使用するキュー。 このキューは、executeメソッドで送信されたRunnableタスクだけを保持する。
      handler - スレッドの境界およびキューの容量に達したため、実行がブロックされたときに使用するハンドラ
      例外:
      IllegalArgumentException - 次のいずれかが当てはまる場合。
      corePoolSize < 0
      keepAliveTime < 0
      maximumPoolSize <= 0
      maximumPoolSize < corePoolSize
      NullPointerException - workQueueまたはhandlerがnullの場合
    • ThreadPoolExecutor

      public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
      指定された初期パラメータを使って、新しいThreadPoolExecutorを作成します。
      パラメータ:
      corePoolSize - allowCoreThreadTimeOutが設定されていないかぎり、アイドルであってもプール内に維持されるスレッドの数
      maximumPoolSize - プール内で可能なスレッドの最大数
      keepAliveTime - スレッドの数がコアよりも多い場合、これは超過したアイドル状態のスレッドが新しいタスクを待機してから終了するまでの最大時間。
      unit - keepAliveTime引数の時間単位
      workQueue - タスクが実行されるまで保持するために使用するキュー。 このキューは、executeメソッドで送信されたRunnableタスクだけを保持する。
      threadFactory - executorが新しいスレッドを作成するときに使用するファクトリ
      handler - スレッドの境界およびキューの容量に達したため、実行がブロックされたときに使用するハンドラ
      例外:
      IllegalArgumentException - 次のいずれかが当てはまる場合。
      corePoolSize < 0
      keepAliveTime < 0
      maximumPoolSize <= 0
      maximumPoolSize < corePoolSize
      NullPointerException - workQueueまたはthreadFactoryまたはhandlerがnullの場合
  • メソッドの詳細

    • execute

      public void execute(Runnable command)
      将来のある時点で指定されたタスクを実行します。 タスクは、新しいスレッドまたは既存のプールされたスレッドで実行されます。 このエグゼキュータがシャットダウンされたか、またはその容量に達したためにタスクを実行依頼できない場合、そのタスクは現在のRejectedExecutionHandlerによって処理されます。
      パラメータ:
      command - 実行するタスク
      例外:
      RejectedExecutionException - RejectedExecutionHandlerの判断で、タスクを実行のために受け入れることができない場合
      NullPointerException - commandがnullである場合
    • shutdown

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

      このメソッドは、以前に送信されたタスクが実行を完了するのを待機しません。 これを実行するには、awaitTerminationを使ってください。

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

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

      このメソッドは、アクティブに実行中のタスクが終了するのを待機しません。 これを実行するには、awaitTerminationを使ってください。

      実行中のアクティブなタスク処理を停止するために最善の努力をすること以上の保証はありません。 この実装は、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のいずれかが最初に呼び出された場合を除き、isTerminatedtrueになることはありません。
      戻り値:
      シャットダウンに続いてすべてのタスクが完了していた場合はtrue
    • awaitTermination

      public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
      インタフェースからコピーされた説明: ExecutorService
      シャットダウン要求後にすべてのタスクが実行を完了していたか、タイム・アウトが発生するか、現在のスレッドで割込みが発生するか、そのいずれかが最初に発生するまでブロックします。
      パラメータ:
      timeout - 待機する最長時間
      unit - timeout引数の時間単位
      戻り値:
      このexecutorが終了した場合はtrue、終了前にタイム・アウトが経過した場合はfalse
      例外:
      InterruptedException - 待機中に割込みが発生した場合
    • finalize

      @Deprecated(since="9", forRemoval=true) protected void finalize()
      削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。
      最終決定は削除のために非推奨になりました。 移行オプションについてのバックグラウンド情報および詳細は、Object.finalize()を参照してください。
      次のクラスからコピーされた説明: Object
      このオブジェクトへの参照はもうないとガベージ・コレクションによって判断されたときに、ガベージ・コレクタによって呼び出されます。 サブクラスはfinalizeメソッドをオーバーライドして、システム・リソースを破棄したり、その他のクリーンアップを行ったりすることができます。

      ファイナライズが無効または削除されているJava仮想マシンで実行されているWhenは、ガベージ・コレクタがfinalize()をコールすることはありません。 ファイナライズが有効なJava仮想マシンでは、ガベージ・コレクタが無期限のdelay.の後にのみfinalizeをコールする場合があります

      finalizeの一般規約では、ファイナライズの準備ができている他のオブジェクトまたはクラスのファイナライズによって実行されたアクションを除き、まだ終了していないスレッドがこのオブジェクトにアクセスできないとJava仮想マシンが判断した場合に呼び出されます。 finalizeメソッドは、このオブジェクトを別のスレッドでふたたび利用可能にすることも含めて、任意のアクションを行うことができます。しかし、finalizeの通常の用途は、オブジェクトを再生不可能な形で破棄する前のクリーンアップを実行することです。 たとえば、入出力の接続を表すオブジェクトのfinalizeメソッドは、オブジェクトが永久的に破棄される前に、接続を切断するための明示的な入出力処理を行います。

      Objectクラスのfinalizeメソッドは、特別な処理を行いません。通常は、何もしないで復帰します。 Objectのサブクラスは、この定義をオーバーライドすることができます。

      Javaプログラミング言語は、任意のオブジェクトについてどのスレッドがfinalizeメソッドを呼び出すかを保証しません。 しかし、finalizeを呼び出すスレッドが、ユーザーに可視な同期ロックをfinalize呼出しの時点では保持していないことについては保証されます。 キャッチされない例外をfinalizeメソッドがスローした場合、例外は無視され、オブジェクトのファイナライズは終了します。

      あるオブジェクトについてfinalizeメソッドが呼び出されたあとに次の処理が発生するのは、まだ生存している任意のスレッドがこのオブジェクトにアクセスできる方法はないと、Java Virtual Machineがふたたび判断したときです。これには、ファイナライズの準備ができているほかのオブジェクトまたはクラスによって発生した処理も含まれ、その時点でこのオブジェクトは破棄されます。

      任意のオブジェクトについてJava Virtual Machineがfinalizeメソッドを複数回呼び出すことはありません。

      finalizeメソッドによって例外がスローされると、finalizeメソッドの処理は停止されます。そうでない場合は無視されます。

      オーバーライド:
      finalize、クラス: Object
      実装上のノート:
      このクラスの以前のバージョンには、このexecutorをシャットダウンするfinalizeメソッドがありましたが、このバージョンではfinalizeは何も行いません。
      関連項目:
    • setThreadFactory

      public void setThreadFactory(ThreadFactory threadFactory)
      新しいスレッドの作成に使用するスレッド・ファクトリを設定します。
      パラメータ:
      threadFactory - 新しいスレッド・ファクトリ
      例外:
      NullPointerException - threadFactoryがnullの場合
      関連項目:
    • getThreadFactory

      public ThreadFactory getThreadFactory()
      新しいスレッドの作成に使用するスレッド・ファクトリを返します。
      戻り値:
      現在のスレッド・ファクトリ
      関連項目:
    • setRejectedExecutionHandler

      public void setRejectedExecutionHandler(RejectedExecutionHandler handler)
      実行可能でないタスクの新しいハンドラを設定します。
      パラメータ:
      handler - 新しいハンドラ
      例外:
      NullPointerException - ハンドラがnullの場合
      関連項目:
    • getRejectedExecutionHandler

      public RejectedExecutionHandler getRejectedExecutionHandler()
      実行可能でないタスクの現在のハンドラを返します。
      戻り値:
      現在のハンドラ
      関連項目:
    • setCorePoolSize

      public void setCorePoolSize(int corePoolSize)
      スレッドのコア数を設定します。 これは、コンストラクタで設定されるあらゆる値をオーバーライドします。 新しい値が現在の値より小さい場合、超過する既存のスレッドは、次のアイドル時に終了します。 大きい場合は、必要に応じて新しいスレッドが起動し、キューに入っているタスクが実行されます。
      パラメータ:
      corePoolSize - 新しいコア・サイズ
      例外:
      IllegalArgumentException - corePoolSize < 0またはcorePoolSize「最大プール・サイズ」よりも大きい場合
      関連項目:
    • getCorePoolSize

      public int getCorePoolSize()
      スレッドのコア数を返します。
      戻り値:
      スレッドのコア数
      関連項目:
    • 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で、現在のキープアライブ時間が0以下の場合
      導入されたバージョン:
      1.6
    • setMaximumPoolSize

      public void setMaximumPoolSize(int maximumPoolSize)
      スレッドの最大許容数を設定します。 これは、コンストラクタで設定されるあらゆる値をオーバーライドします。 新しい値が現在の値より小さい場合、超過する既存のスレッドは、次のアイドル時に終了します。
      パラメータ:
      maximumPoolSize - 新しい最大値
      例外:
      IllegalArgumentException - 新しい最大値が0以下か、またはコア・プール・サイズより小さい場合
      関連項目:
    • getMaximumPoolSize

      public int getMaximumPoolSize()
      スレッドの最大許容数を返します。
      戻り値:
      スレッドの最大許容数
      関連項目:
    • setKeepAliveTime

      public void setKeepAliveTime(long time, TimeUnit unit)
      スレッドが終了する前にアイドル状態を維持する可能性がある時間を示すスレッド・キープアライブ時間を設定します。 タスクを処理せずにこの時間を待っているスレッドは、プール内に現在存在するスレッドのコア数より多い場合、またはこのプールが「コア・スレッドのタイムアウトを許可」の場合は終了します。 これは、コンストラクタで設定されるあらゆる値をオーバーライドします。
      パラメータ:
      time - 待機する時間。 time値がゼロの場合は、タスクを実行するとすぐに超過したスレッドが終了する。
      unit - time引数の時間単位
      例外:
      IllegalArgumentException - timeが0より小さい場合、またはtimeが0でallowsCoreThreadTimeOutの場合
      関連項目:
    • getKeepAliveTime

      public long getKeepAliveTime(TimeUnit unit)
      スレッドが終了する前にアイドル状態のままになる可能性があるスレッドのキープアライブ時間を返します。 タスクを処理せずにこの時間を待っているスレッドは、プール内に現在存在するスレッドのコア数より多い場合、またはこのプールが「コア・スレッドのタイムアウトを許可」の場合は終了します。
      パラメータ:
      unit - 戻り値に指定する時間単位
      戻り値:
      制限時間
      関連項目:
    • 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()
      これまでに実行が完了したタスクのおよその総数を返します。 タスクおよびスレッドの状態は、計算中に動的に変化することがあるため、戻り値は近似にすぎませんが、連続して呼び出しても減少しません。
      戻り値:
      タスク数
    • toString

      public String toString()
      実行状態および推定のワーカーおよびタスク・カウントの指示を含めて、このプールおよびその状態を識別する文字列を返します。
      オーバーライド:
      toString 、クラス:  Object
      戻り値:
      このプールおよびその状態を識別する文字列
    • 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です。

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

      ノート: アクションが明示的に、またはsubmitなどのメソッドによって、タスク(FutureTaskなど)内に収まる場合、これらのタスク・オブジェクトは計算の例外をキャッチして維持します。そのため、異常終了することはなく、内部例外はこのメソッドに渡されません このメソッドで両方の種類の失敗をトラップする場合は、タスクが強制的に中止された場合の直接の原因または原因となった例外のどちらかを出力するこのサンプル・サブクラスのように、このようなケースをさらに調べることができます。

       
       class ExtendedExecutor extends ThreadPoolExecutor {
         // ...
         protected void afterExecute(Runnable r, Throwable t) {
           super.afterExecute(r, t);
           if (t == null
               && r instanceof Future<?>
               && ((Future<?>)r).isDone()) {
             try {
               Object result = ((Future<?>) r).get();
             } catch (CancellationException ce) {
               t = ce;
             } catch (ExecutionException ee) {
               t = ee.getCause();
             } catch (InterruptedException ie) {
               // ignore/reset
               Thread.currentThread().interrupt();
             }
           }
           if (t != null)
             System.out.println(t);
         }
       }

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

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