public class ThreadPoolExecutor extends AbstractExecutorService
ExecutorService
です。通常は Executors
ファクトリメソッドを使用して構成されます。
スレッドプールでは、2 つの問題に対処します。まず、タスクあたりの呼び出しオーバーヘッドが減少するため、通常は大量の非同期タスクの実行時にパフォーマンスが向上します。また、タスクのコレクションを実行するときに消費されるリソース (スレッドを含む) の境界設定および管理のための方法を提供します。各 ThreadPoolExecutor
も基本的な統計情報 (完了したタスクの数など) を保持します。
幅広いコンテキストで有用であるために、このクラスでは多くの調整可能なパラメータや拡張性フックを提供します。ただしプログラマは、より便利な Executors
ファクトリメソッドである Executors.newCachedThreadPool()
(自動スレッド再生のあるアンバウンド形式のスレッドプール)、Executors.newFixedThreadPool(int)
(固定サイズのスレッドプール)、および Executors.newSingleThreadExecutor()
(単一バックグラウンドのスレッド) を使用してください。これらのファクトリメソッドは、もっとも一般的な使用を想定した設定を事前設定します。そうでない場合、このクラスを手動で設定し調整するときは次のガイドに従ってください。
ThreadPoolExecutor
は、corePoolSize (getCorePoolSize()
を参照) と maximumPoolSize (getMaximumPoolSize()
を参照) によって設定された境界に従って、プールサイズ (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 は続行しますが、タスクをまったく実行できない可能性があります。スレッドは、「modifyThread」の RuntimePermission
を所有するようにしてください。プールを使用しているワーカースレッドやその他のスレッドがこのアクセス権を所有していないと、サービスが低下する場合があります。構成の変更がタイムリーに有効にならなかったり、プールのシャットダウンが、終了は可能だが完了していない状態のままになったりする場合があります。getKeepAliveTime(java.util.concurrent.TimeUnit)
を参照)。これにより、プールがアクティブに使用されていないときのリソースの消費量を減らすことができます。プールがあとでアクティブになると、新しいスレッドが構築されます。また、このパラメータは、setKeepAliveTime(long, java.util.concurrent.TimeUnit)
メソッドを使用して動的に変更することもできます。Long.MAX_VALUE
TimeUnit.NANOSECONDS
の値を使用すると、アイドルスレッドがシャットダウン前に終了することも実質的に無効になります。デフォルトでは、corePoolSizeThreads を超える場合にのみキープアライブポリシーを適用します。ただし、keepAliveTime の値が 0 以外であれば、allowCoreThreadTimeOut(boolean)
メソッドを使用して、このタイムアウトポリシーをコアスレッドにも適用できます。 BlockingQueue
を使用できます。このキューの使用は、プールのサイズ設定と相互に作用します。
SynchronousQueue
です。これは、本来はタスクを保持します。この場合、タスクを実行するためにすぐに利用できるスレッドがないと、タスクをキューに入れようとしたときに失敗し、新しいスレッドが構築されます。このポリシーにより、内部的な依存関係を持つ可能性がある要求セットの処理時にロックアップが回避されます。一般に直接ハンドオフでは、送信された新しいタスクが拒否されるのを回避するために、アンバウンド形式の maximumPoolSizes が必要です。これにより、平均して処理能力を超える速さでコマンドが次々に到着すると、アンバウンド形式のスレッドが大きくなる可能性があります。 LinkedBlockingQueue
など) を使用すると、corePoolSize のすべてのスレッドがビジー状態である場合に、新しいタスクはキュー内で待機します。これにより、corePoolSize を超えるスレッドは作成されなくなります。つまり maximumPoolSize の値は効果がなくなります。各タスクが完全に独立しているため、タスクが相互の実行に影響しない場合はこの方式が適切であることがあります (Web ページサーバーの場合など)。この方式のキューイングは、一時的に急増した要求を処理する場合などは便利ですが、平均して処理能力を超える速さでコマンドが次々に到着すると、アンバウンド形式のワークキューが大きくなる可能性があります。 ArrayBlockingQueue
など) は、限定された maximumPoolSizes で使用するとリソース不足を回避できますが、調整と制御が難しくなる可能性があります。キューサイズと最大プールサイズは互いにトレードオフの関係になることがあります。大きなキューと小さなプールを使用すると、CPU 使用率、OS リソース量、およびコンテキストスイッチングのオーバーヘッドは最小化されますが、スループットは大幅に低下する可能性があります。タスクが頻繁にブロックする場合は (入出力が制限される場合など)、許可しているスレッド数よりも多くのスレッドに対して、システムが時間をスケジュールすることができます。小さいキューを使用すると、一般に必要なプールサイズは大きくなります。これにより、CPU がよりビジーになりますが、過大なスケジュール設定のオーバーヘッドが発生することがあり、スループットも低下します。 execute(java.lang.Runnable)
メソッドで送信された新しいタスクは拒否されます。いずれの場合も、execute
メソッドは、その RejectedExecutionHandler
の RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor)
メソッドを呼び出します。事前定義された 4 つのハンドラポリシーが用意されています。
ThreadPoolExecutor.AbortPolicy
では、拒否されると、ハンドラは実行時の RejectedExecutionException
をスローします。 ThreadPoolExecutor.CallerRunsPolicy
では、execute
自体を呼び出すスレッドがタスクを実行します。これにより、単純なフィードバック制御メカニズムが提供され、結果として新しいタスクの送信レートが低下します。 ThreadPoolExecutor.DiscardPolicy
では、実行できないタスクが単に削除されます。 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();
}
}
}
修飾子と型 | クラスと説明 |
---|---|
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 が終了したときに呼び出されるメソッドです。
|
String |
toString()
実行状態および推定のワーカーおよびタスクカウントの指示を含めて、このプールおよびその状態を識別する文字列を返します。
|
invokeAll, invokeAll, invokeAny, invokeAny, newTaskFor, newTaskFor, submit, submit, submit
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 である場合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 の場合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 の場合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 の場合public void execute(Runnable command)
RejectedExecutionHandler
によって処理されます。command
- 実行するタスクRejectedExecutionException
- RejectedExecutionHandler
の判断で、タスクを実行のために受け入れることができない場合NullPointerException
- command
が null である場合public void shutdown()
このメソッドは、以前に送信されたタスクが実行を完了するのを待機しません。これを実行するには、awaitTermination
を使ってください。
SecurityException
- セキュリティーマネージャーが存在する状況でこの ExecutorService のシャットダウンを実行すると、呼び出し側には変更を許可しないスレッドを操作できる場合。これは、RuntimePermission
("modifyThread") を保持しないか、セキュリティーマネージャーの checkAccess メソッドがアクセスを拒否するためである。public List<Runnable> shutdownNow()
このメソッドは、アクティブに実行中のタスクが終了するのを待機しません。これを実行するには、awaitTermination
を使ってください。
実行中のアクティブなタスク処理を停止するために最善の努力をすること以上の保証はありません。この実装では、Thread.interrupt()
を介してタスクを取り消すため、割り込みに対する応答に失敗したタスクは終了しなくなる可能性があります。
SecurityException
- セキュリティーマネージャーが存在する状況でこの ExecutorService のシャットダウンを実行すると、呼び出し側には変更を許可しないスレッドを操作できる場合。これは、RuntimePermission
("modifyThread") を保持しないか、セキュリティーマネージャーの checkAccess メソッドがアクセスを拒否するためである。public boolean isShutdown()
ExecutorService
public boolean isTerminating()
shutdown()
または shutdownNow()
のあとでこの executor が終了処理中だが、完全に終了していない場合は、true を返します。このメソッドはデバッグに便利なことがあります。シャットダウン後に十分な時間が経ってから報告された true
の戻り値は、送信されたタスクが割り込みを無視または抑制したために、この executor が適切に終了されないことを示す可能性があります。public boolean isTerminated()
ExecutorService
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
ExecutorService
timeout
- 待機する最長時間unit
- timeout 引数の時間単位InterruptedException
- 待機中に割り込みが発生した場合protected void finalize()
shutdown
を呼び出します。public void setThreadFactory(ThreadFactory threadFactory)
threadFactory
- 新しいスレッドファクトリNullPointerException
- threadFactory が null の場合getThreadFactory()
public ThreadFactory getThreadFactory()
setThreadFactory(java.util.concurrent.ThreadFactory)
public void setRejectedExecutionHandler(RejectedExecutionHandler handler)
handler
- 新しいハンドラNullPointerException
- ハンドラが null の場合getRejectedExecutionHandler()
public RejectedExecutionHandler getRejectedExecutionHandler()
public void setCorePoolSize(int corePoolSize)
corePoolSize
- 新しいコアサイズIllegalArgumentException
- corePoolSize < 0
の場合getCorePoolSize()
public int getCorePoolSize()
setCorePoolSize(int)
public boolean prestartCoreThread()
false
を返します。true
public int prestartAllCoreThreads()
public boolean allowsCoreThreadTimeOut()
true
。それ以外の場合は false
public void allowCoreThreadTimeOut(boolean value)
true
に設定するときは、キープアライブ時間をゼロよりも大きくする必要があります。通常は、このメソッドを呼び出してから、プールをアクティブに使用してください。value
- タイムアウトするようにする場合は true
。それ以外の場合は false
IllegalArgumentException
- 値が true
で、現在のキープアライブ時間が 0 以下の場合public void setMaximumPoolSize(int maximumPoolSize)
maximumPoolSize
- 新しい最大値IllegalArgumentException
- 新しい最大値が 0 以下か、またはコアプールサイズより小さい場合getMaximumPoolSize()
public int getMaximumPoolSize()
setMaximumPoolSize(int)
public void setKeepAliveTime(long time, TimeUnit unit)
time
- 待機する時間。time 値がゼロの場合は、タスクを実行するとすぐに超過したスレッドが終了する。unit
- time
引数の時間単位IllegalArgumentException
- time
が 0 より小さい場合、または time
が 0 で allowsCoreThreadTimeOut
の場合getKeepAliveTime(java.util.concurrent.TimeUnit)
public long getKeepAliveTime(TimeUnit unit)
unit
- 戻り値に指定する時間単位setKeepAliveTime(long, java.util.concurrent.TimeUnit)
public BlockingQueue<Runnable> getQueue()
public boolean remove(Runnable task)
このメソッドは取り消し方式の一部として便利なことがあります。内部キューに配置される前に別の形式に変換されたタスクは、削除に失敗する可能性があります。たとえば、submit
を使用して入るタスクは、Future
状態を維持する形式に変換されることがあります。ただし、この場合は、purge()
メソッドを使用して、取り消された Future を削除することができます。
task
- 削除するタスクpublic void purge()
Future
タスクをワークキューから削除しようとします。このメソッドは、機能にその他の影響のない、記憶領域の再生オペレーションとして便利なことがあります。取り消されたタスクが実行されることはありませんが、ワークスレッドがアクティブに削除するまでワークキュー内に蓄積される場合があります。このメソッドを呼び出すと、ただちに削除しようとします。ただし、その他のスレッドによる干渉が存在する場合は、このメソッドはタスクの削除に失敗することがあります。public int getPoolSize()
public int getActiveCount()
public int getLargestPoolSize()
public long getTaskCount()
public long getCompletedTaskCount()
public String toString()
protected void beforeExecute(Thread t, Runnable r)
r
を実行するスレッド t
によって呼び出され、ThreadLocal の再初期化やロギングの実行に使用される場合があります。
この実装は処理を行いませんが、サブクラスでカスタマイズすることは可能です。注:複数のオーバーライドを適切に入れ子にするため、通常は、サブクラスではこのメソッドの最後で super.beforeExecute
を呼び出すようにしてください。
t
- タスク r
を実行するスレッドr
- 実行されるタスクprotected void afterExecute(Runnable r, Throwable t)
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<?>) {
try {
Object result = ((Future<?>) r).get();
} catch (CancellationException ce) {
t = ce;
} catch (ExecutionException ee) {
t = ee.getCause();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt(); // ignore/reset
}
}
if (t != null)
System.out.println(t);
}
}
r
- 完了した Runnablet
- 終了の原因となった例外。実行が正常に完了した場合は nullprotected void terminated()
super.terminated
を呼び出すようにしてください。 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.