- すべての実装されたインタフェース:
Executor
,ExecutorService
- 直系の既知のサブクラス:
ScheduledThreadPoolExecutor
public class ThreadPoolExecutor extends AbstractExecutorService
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を超えない場合は新しいスレッドが作成され、超える場合はタスクが拒否されます。
- 直接ハンドオフ。 ワーク・キューに適したデフォルトの選択肢は、タスクを保持しないでスレッドにハンドオフする
SynchronousQueue
です。これは、本来はタスクを保持します。 この場合、タスクを実行するためにすぐに利用できるスレッドがないと、タスクをキューに入れようとしたときに失敗し、新しいスレッドが構築されます。 このポリシーにより、内部的な依存関係を持つ可能性がある要求セットの処理時にロック・アップが回避されます。 一般に直接ハンドオフでは、送信された新しいタスクが拒否されるのを回避するために、アンバウンド形式のmaximumPoolSizesが必要です。 これにより、平均して処理能力を超える速さでコマンドが次々に到着すると、アンバウンド形式のスレッドが大きくなる可能性があります。 - アンバウンド形式のキュー。 アンバウンド形式のキュー(事前定義された容量を持たない
LinkedBlockingQueue
など)を使用すると、corePoolSizeのすべてのスレッドがビジー状態である場合に、新しいタスクはキュー内で待機します。 これにより、corePoolSizeを超えるスレッドは作成されなくなります。 つまりmaximumPoolSizeの値は効果がなくなります。 各タスクが完全に独立しているため、タスクが相互の実行に影響しない場合はこの方式が適切であることがあります(Webページ・サーバーの場合など)。 この方式のキューイングは、一時的に急増した要求を処理する場合などは便利ですが、平均して処理能力を超える速さでコマンドが次々に到着すると、アンバウンド形式のワーク・キューが大きくなる可能性があります。 - バウンド形式のキュー。 バウンド形式のキュー(
ArrayBlockingQueue
など)は、限定されたmaximumPoolSizesで使用するとリソース不足を回避できますが、調整と制御が難しくなる可能性があります。 キュー・サイズと最大プール・サイズは互いにトレードオフの関係になることがあります。大きなキューと小さなプールを使用すると、CPU使用率、OSリソース量、およびコンテキスト・スイッチングのオーバーヘッドは最小化されますが、スループットは大幅に低下する可能性があります。 タスクが頻繁にブロックする場合は(入出力が制限される場合など)、許可しているスレッド数よりも多くのスレッドに対して、システムが時間をスケジュールすることができます。 小さいキューを使用すると、一般に必要なプール・サイズは大きくなります。これにより、CPUがよりビジーになりますが、過大なスケジュール設定のオーバーヘッドが発生することがあり、スループットも低下します。
- 拒否されたタスク
- Executorがシャットダウンしている場合、またはExecutorが最大スレッド数とワーク・キュー容量の両方で有限の境界を使用し、かつ飽和状態である場合、
execute(Runnable)
メソッドで送信された新しいタスクは拒否されます。 いずれの場合も、execute
メソッドは、そのRejectedExecutionHandler
のRejectedExecutionHandler.rejectedExecution(Runnable, ThreadPoolExecutor)
メソッドを呼び出します。 事前定義された4つのハンドラ・ポリシーが用意されています。- デフォルトの
ThreadPoolExecutor.AbortPolicy
では、拒否されると、ハンドラは実行時のRejectedExecutionException
をスローします。 ThreadPoolExecutor.CallerRunsPolicy
では、execute
自体を呼び出すスレッドがタスクを実行します。 これにより、単純なフィード・バック制御メカニズムが提供され、結果として新しいタスクの送信レートが低下します。ThreadPoolExecutor.DiscardPolicy
では、実行できないタスクが単に削除されます。ThreadPoolExecutor.DiscardOldestPolicy
では、executorがシャットダウンしていない場合は、ワーク・キューの先頭にあるタスクが削除されたあと、実行が再試行されます(もう一度失敗する可能性があり、その場合はこの処理が繰り返される)。
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
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を返します。protected void
beforeExecute(Thread t, Runnable r)
指定されたスレッドで指定されたRunnableを実行する前に呼び出されるメソッドです。void
execute(Runnable command)
将来のある時点で指定されたタスクを実行します。protected void
finalize()
非推奨。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
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が終了したときに呼び出されるメソッドです。String
toString()
実行状態および推定のワーカーおよびタスク・カウントの指示を含めて、このプールおよびその状態を識別する文字列を返します。クラス java.util.concurrent.AbstractExecutorServiceで宣言されたメソッド
newTaskFor, newTaskFor, submit, submit, submit
クラス java.lang.Objectで宣言されたメソッド
clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
インタフェース java.util.concurrent.ExecutorServiceで宣言されたメソッド
awaitTermination, invokeAll, invokeAll, invokeAny, invokeAny, isShutdown, isTerminated
-
コンストラクタの詳細
-
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
実行中のアクティブなタスクすべての停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。 これらのタスクは、このメソッドから戻るときに、タスク・キューからドレイン(削除)されます。このメソッドは、アクティブに実行中のタスクが終了するのを待機しません。 これを実行するには、
awaitTermination
を使ってください。実行中のアクティブなタスク処理を停止するために最善の努力をすること以上の保証はありません。 この実装は、
Thread.interrupt()
を介してタスクを中断します。割り込みに応答しないタスクは決して終了しない可能性があります。- 戻り値:
- 実行が開始されなかったタスクのリスト
- 例外:
SecurityException
- セキュリティ・マネージャが存在する状況でこのExecutorServiceのシャットダウンを実行すると、呼出し側には変更を許可しないスレッドを操作できる場合。これは、RuntimePermission
("modifyThread")
を保持しないか、セキュリティ・マネージャのcheckAccess
メソッドがアクセスを拒否するためである。
-
isTerminating
public boolean isTerminating()shutdown()
またはshutdownNow()
のあとでこのexecutorが終了処理中だが、完全に終了していない場合は、trueを返します。 このメソッドはデバッグに便利なことがあります。 シャットダウン後に十分な時間が経ってから報告されたtrue
の戻り値は、送信されたタスクが割込みを無視または抑制したために、このexecutorが適切に終了されないことを示す可能性があります。- 戻り値:
- 終了中だが、まだ終了していない場合は
true
-
finalize
@Deprecated(since="9") protected void finalize()非推奨。次のクラスからコピーされた説明:Object
このオブジェクトへの参照はもうないとガベージ・コレクションによって判断されたときに、ガベージ・コレクタによって呼び出されます。 サブクラスは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は何も行いません。
- 関連項目:
WeakReference
,PhantomReference
-
setThreadFactory
public void setThreadFactory(ThreadFactory threadFactory)新しいスレッドの作成に使用するスレッド・ファクトリを設定します。- パラメータ:
threadFactory
- 新しいスレッド・ファクトリ- 例外:
NullPointerException
- threadFactoryがnullの場合- 関連項目:
getThreadFactory()
-
getThreadFactory
public ThreadFactory getThreadFactory()新しいスレッドの作成に使用するスレッド・ファクトリを返します。- 戻り値:
- 現在のスレッド・ファクトリ
- 関連項目:
setThreadFactory(ThreadFactory)
-
setRejectedExecutionHandler
public void setRejectedExecutionHandler(RejectedExecutionHandler handler)実行可能でないタスクの新しいハンドラを設定します。- パラメータ:
handler
- 新しいハンドラ- 例外:
NullPointerException
- ハンドラがnullの場合- 関連項目:
getRejectedExecutionHandler()
-
getRejectedExecutionHandler
public RejectedExecutionHandler getRejectedExecutionHandler()実行可能でないタスクの現在のハンドラを返します。- 戻り値:
- 現在のハンドラ
- 関連項目:
setRejectedExecutionHandler(RejectedExecutionHandler)
-
setCorePoolSize
public void setCorePoolSize(int corePoolSize)スレッドのコア数を設定します。 これは、コンストラクタで設定されるあらゆる値をオーバーライドします。 新しい値が現在の値より小さい場合、超過する既存のスレッドは、次のアイドル時に終了します。 大きい場合は、必要に応じて新しいスレッドが起動し、キューに入っているタスクが実行されます。- パラメータ:
corePoolSize
- 新しいコア・サイズ- 例外:
IllegalArgumentException
-corePoolSize < 0
または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
で、現在のキープアライブ時間が0以下の場合- 導入されたバージョン:
- 1.6
-
setMaximumPoolSize
public void setMaximumPoolSize(int maximumPoolSize)スレッドの最大許容数を設定します。 これは、コンストラクタで設定されるあらゆる値をオーバーライドします。 新しい値が現在の値より小さい場合、超過する既存のスレッドは、次のアイドル時に終了します。- パラメータ:
maximumPoolSize
- 新しい最大値- 例外:
IllegalArgumentException
- 新しい最大値が0以下か、またはコア・プール・サイズより小さい場合- 関連項目:
getMaximumPoolSize()
-
getMaximumPoolSize
public int getMaximumPoolSize()スレッドの最大許容数を返します。- 戻り値:
- スレッドの最大許容数
- 関連項目:
setMaximumPoolSize(int)
-
setKeepAliveTime
public void setKeepAliveTime(long time, TimeUnit unit)スレッドが終了する前にアイドル状態を維持する可能性がある時間を示すスレッド・キープアライブ時間を設定します。 タスクを処理せずにこの時間を待っているスレッドは、プール内に現在存在するスレッドのコア数より多い場合、またはこのプールが「コア・スレッドのタイムアウトを許可」の場合は終了します。 これは、コンストラクタで設定されるあらゆる値をオーバーライドします。- パラメータ:
time
- 待機する時間。 time値がゼロの場合は、タスクを実行するとすぐに超過したスレッドが終了する。unit
-time
引数の時間単位- 例外:
IllegalArgumentException
-time
が0より小さい場合、またはtime
が0でallowsCoreThreadTimeOut
の場合- 関連項目:
getKeepAliveTime(TimeUnit)
-
getKeepAliveTime
public long getKeepAliveTime(TimeUnit unit)スレッドが終了する前にアイドル状態のままになる可能性があるスレッドのキープアライブ時間を返します。 タスクを処理せずにこの時間を待っているスレッドは、プール内に現在存在するスレッドのコア数より多い場合、またはこのプールが「コア・スレッドのタイムアウトを許可」の場合は終了します。- パラメータ:
unit
- 戻り値に指定する時間単位- 戻り値:
- 制限時間
- 関連項目:
setKeepAliveTime(long, 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()これまでに実行が完了したタスクのおよその総数を返します。 タスクおよびスレッドの状態は、計算中に動的に変化することがあるため、戻り値は近似にすぎませんが、連続して呼び出しても減少しません。- 戻り値:
- タスク数
-
toString
public String toString()実行状態および推定のワーカーおよびタスク・カウントの指示を含めて、このプールおよびその状態を識別する文字列を返します。 -
beforeExecute
指定されたスレッドで指定されたRunnableを実行する前に呼び出されるメソッドです。 このメソッドは、タスクr
を実行するスレッドt
によって呼び出され、ThreadLocalの再初期化やロギングの実行に使用される場合があります。この実装は処理を行いませんが、サブクラスでカスタマイズすることは可能です。 ノート: 複数のオーバーライドを適切に入れ子にするため、通常は、サブクラスではこのメソッドの最後で
super.beforeExecute
を呼び出すようにしてください。- パラメータ:
t
- タスクr
を実行するスレッドr
- 実行されるタスク
-
afterExecute
指定された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
- 完了したRunnablet
- 終了の原因となった例外。実行が正常に完了した場合はnull
-
terminated
protected void terminated()executorが終了したときに呼び出されるメソッドです。 デフォルトの実装は処理を行いません。 ノート: 複数のオーバーライドを適切に入れ子にするため、通常、サブクラスではこのメソッド内でsuper.terminated
を呼び出すようにしてください。
-