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より少ないスレッドが実行されている場合は、他のワーカー・スレッドがアイドル状態であっても、要求を処理するために新しいスレッドが作成されます。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(TimeUnit)
を参照)。これにより、プールがアクティブに使用されていないときのリソースの消費量を減らすことができます。プールがあとでアクティブになると、新しいスレッドが構築されます。また、このパラメータは、setKeepAliveTime(long, TimeUnit)
メソッドを使用して動的に変更することもできます。Long.MAX_VALUE
TimeUnit.NANOSECONDS
の値を使用すると、アイドル・スレッドがシャットダウン前に終了することも実質的に無効になります。デフォルトでは、corePoolSizeの数より多くのスレッドが存在する場合にのみキープアライブ・ポリシーを適用します。ただし、keepAliveTimeの値が0以外であれば、allowCoreThreadTimeOut(boolean)
メソッドを使用して、このタイムアウト・ポリシーをコア・スレッドにも適用できます。 BlockingQueue
を使用できます。このキューの使用は、プールのサイズ設定と相互に作用します。
SynchronousQueue
です。これは、本来はタスクを保持します。この場合、タスクを実行するためにすぐに利用できるスレッドがないと、タスクをキューに入れようとしたときに失敗し、新しいスレッドが構築されます。このポリシーにより、内部的な依存関係を持つ可能性がある要求セットの処理時にロック・アップが回避されます。一般に直接ハンドオフでは、送信された新しいタスクが拒否されるのを回避するために、アンバウンド形式のmaximumPoolSizesが必要です。これにより、平均して処理能力を超える速さでコマンドが次々に到着すると、アンバウンド形式のスレッドが大きくなる可能性があります。 LinkedBlockingQueue
など)を使用すると、corePoolSizeのすべてのスレッドがビジー状態である場合に、新しいタスクはキュー内で待機します。これにより、corePoolSizeを超えるスレッドは作成されなくなります。つまりmaximumPoolSizeの値は効果がなくなります。各タスクが完全に独立しているため、タスクが相互の実行に影響しない場合はこの方式が適切であることがあります(Webページ・サーバーの場合など)。この方式のキューイングは、一時的に急増した要求を処理する場合などは便利ですが、平均して処理能力を超える速さでコマンドが次々に到着すると、アンバウンド形式のワーク・キューが大きくなる可能性があります。 ArrayBlockingQueue
など)は、限定されたmaximumPoolSizesで使用するとリソース不足を回避できますが、調整と制御が難しくなる可能性があります。キュー・サイズと最大プール・サイズは互いにトレードオフの関係になることがあります。大きなキューと小さなプールを使用すると、CPU使用率、OSリソース量、およびコンテキスト・スイッチングのオーバーヘッドは最小化されますが、スループットは大幅に低下する可能性があります。タスクが頻繁にブロックする場合は(入出力が制限される場合など)、許可しているスレッド数よりも多くのスレッドに対して、システムが時間をスケジュールすることができます。小さいキューを使用すると、一般に必要なプール・サイズは大きくなります。これにより、CPUがよりビジーになりますが、過大なスケジュール設定のオーバーヘッドが発生することがあり、スループットも低下します。 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()
メソッドをオーバーライドできます。
フックまたはコールバック・メソッドが例外をスローすると、内部のワーカー・スレッドは失敗して強制終了します。
getQueue()
メソッドを使用すると、監視やデバッグの目的でワーク・キューにアクセスできます。その他の目的でこのメソッドを使用しないことが強く推奨されています。提供される2つのメソッドremove(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
true
を返します。true
public boolean isTerminating()
shutdown()
またはshutdownNow()
のあとでこのexecutorが終了処理中だが、完全に終了していない場合は、trueを返します。このメソッドはデバッグに便利なことがあります。シャットダウン後に十分な時間が経ってから報告されたtrue
の戻り値は、送信されたタスクが割込みを無視または抑制したために、このexecutorが適切に終了されないことを示す可能性があります。true
public boolean isTerminated()
ExecutorService
true
を返します。shutdown
またはshutdownNow
のいずれかが最初に呼び出された場合を除き、isTerminated
がtrue
になることはありません。true
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
ExecutorService
timeout
- 待機する最長時間unit
- timeout引数の時間単位true
、終了前にタイム・アウトが経過した場合はfalse
InterruptedException
- 待機中に割込みが発生した場合protected void finalize()
shutdown
を呼び出します。finalize
、クラス: Object
WeakReference
, PhantomReference
public void setThreadFactory(ThreadFactory threadFactory)
threadFactory
- 新しいスレッド・ファクトリNullPointerException
- threadFactoryがnullの場合getThreadFactory()
public ThreadFactory getThreadFactory()
setThreadFactory(ThreadFactory)
public void setRejectedExecutionHandler(RejectedExecutionHandler handler)
handler
- 新しいハンドラNullPointerException
- ハンドラがnullの場合getRejectedExecutionHandler()
public RejectedExecutionHandler getRejectedExecutionHandler()
setRejectedExecutionHandler(RejectedExecutionHandler)
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(TimeUnit)
public long getKeepAliveTime(TimeUnit unit)
unit
- 戻り値に指定する時間単位setKeepAliveTime(long, TimeUnit)
public BlockingQueue<Runnable> getQueue()
public boolean remove(Runnable task)
このメソッドは取消し方式の一部として便利なことがあります。内部キューに配置される前に別の形式に変換されたタスクは、削除に失敗する可能性があります。たとえば、submit
を使用して入るタスクは、Future
状態を維持する形式に変換されることがあります。ただし、この場合は、purge()
メソッドを使用して、取り消されたFutureを削除することができます。
task
- 削除するタスクtrue
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, 2014, Oracle and/or its affiliates. All rights reserved.