|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.util.concurrent.AbstractExecutorService java.util.concurrent.ThreadPoolExecutor
public class ThreadPoolExecutor
多くの場合、プールされた複数のスレッドのいずれかを使用して、送信された各タスクを実行する ExecutorService
。通常は、Executors
ファクトリメソッドを使用して構成されます。
スレッドプールは、タスクごとの呼び出しのオーバーヘッドを減少させることで大量の非同期タスクを実行する際のパフォーマンスを改善し、タスクのコレクションを実行する際に消費されるスレッド等のリソースを制限および管理する手段を提供することで、異なる 2 つの問題に対応します。各 ThreadPoolExecutor も、完了タスクの数などのいくつかの基本的な統計を管理します。
広範なコンテキストで有用であるために、このクラスは調整可能な多数のパラメータおよび拡張機能フックを提供します。ただし、プログラマは、より利便性の高い Executors
ファクトリメソッドである Executors.newCachedThreadPool()
(アンバウンド形式のスレッドプール、自動スレッド再生を含む)、Executors.newFixedThreadPool(int)
(固定サイズのスレッドプール)、および Executors.newSingleThreadExecutor()
(単独のバックグラウンドスレッド) を使用することが推奨されています。これらのメソッドは、一般に使用される大半のシナリオに合わせてあらかじめ設定されています。そうでない場合は、次に示すガイドに従ってこのクラスを手動で構成およびチューニングしてください。
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 は続行しますが、タスクを実行できない可能性があります。getKeepAliveTime(java.util.concurrent.TimeUnit)
を参照) を超過すると、超過したスレッドは終了します。これにより、プールがアクティブに使用されていない場合に、リソースの消費を抑えることができます。プールがあとでよりアクティブになると、新規スレッドが作成されます。このパラメータは、setKeepAliveTime(long, java.util.concurrent.TimeUnit)
メソッドを使用して動的に変更することも可能です。Long.MAX_VALUE TimeUnit.NANOSECONDS
値を使用すると、アイドル状態のスレッドがシャットダウン前に終了しないようにできます。 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
クラスを定義および使用することも可能です。この場合、特にポリシーが特定の容量またはキューイングポリシーでのみ動作するように設計されている場合は、注意が必要です。 beforeExecute(java.lang.Thread, java.lang.Runnable)
および afterExecute(java.lang.Runnable, java.lang.Throwable)
メソッドを提供します。これは、各タスクの実行前後に呼び出されます。これらは、ThreadLocals の再初期化、統計の収集、ログエントリの追加などの、実行環境の操作に使用できます。また、terminated()
メソッドをオーバーライドして、Executor が完全に終了したあとで実行する必要のある特殊な処理を実行できます。
フックメソッドまたはコールバックメソッドが例外をスローすると、内部のワーカスレッドが失敗してただちに終了します。
getQueue()
メソッドを使用すると、監視およびデバッグ目的で作業キューにアクセスできます。他の目的でこのメソッドを使用することは、可能なかぎり避けてください。キューに入れられた大量のタスクが取り消された場合、提供される 2 つのメソッド remove(java.lang.Runnable)
および purge()
を記憶領域の再生の支援に使用できます。拡張機能の例。このクラスの拡張機能の大半は、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 の実行完了時に呼び出されるメソッド。 |
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, submit, submit, submit |
クラス java.lang.Object から継承されたメソッド |
---|
clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
コンストラクタの詳細 |
---|
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
Executors
ファクトリメソッドの 1 つを使用した方が便利な場合があります。
corePoolSize
- プール内に保持するスレッドの数 (アイドル状態のスレッドも含む)maximumPoolSize
- プールで許可されるスレッドの最大数keepAliveTime
- スレッドの数がコアよりも多い場合、これは、超過したアイドル状態のスレッドが終了前に新規タスクを待機する最大時間になるunit
- keepAliveTime 引数の時間単位workQueue
- タスクを実行する前に、タスク保持に使用するキュー。このキューは、execute メソッドにより送信された Runnable タスクだけを保持する
IllegalArgumentException
- corePoolSize または keepAliveTime がゼロ未満の場合、maximumPoolSize がゼロ以下の場合、または corePoolSize が maximumPoolSize より大きい場合
NullPointerException
- workQueue が null の場合public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
corePoolSize
- プール内に保持するスレッドの数 (アイドル状態のスレッドも含む)maximumPoolSize
- プールで許可されるスレッドの最大数keepAliveTime
- スレッドの数がコアよりも多い場合、これは、超過したアイドル状態のスレッドが終了前に新規タスクを待機する最大時間になるunit
- keepAliveTime 引数の時間単位workQueue
- タスクを実行する前に、タスク保持に使用するキュー。このキューは、execute メソッドにより送信された Runnable タスクだけを保持するthreadFactory
- executor が新規スレッドを作成する際に使用するファクトリ
IllegalArgumentException
- corePoolSize または keepAliveTime がゼロ未満の場合、maximumPoolSize がゼロ以下の場合、または corePoolSize が maximumPoolSize より大きい場合
NullPointerException
- workQueue または threadFactory が null の場合public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
corePoolSize
- プール内に保持するスレッドの数 (アイドル状態のスレッドも含む)maximumPoolSize
- プールで許可されるスレッドの最大数keepAliveTime
- スレッドの数がコアよりも多い場合、これは、超過したアイドル状態のスレッドが終了前に新規タスクを待機する最大時間になるunit
- keepAliveTime 引数の時間単位workQueue
- タスクを実行する前に、タスク保持に使用するキュー。このキューは、execute メソッドにより送信された Runnable タスクだけを保持するhandler
- スレッドが制限に達するか、キューが容量に達したために実行がブロックされた場合に使用するハンドラ
IllegalArgumentException
- corePoolSize または keepAliveTime がゼロ未満の場合、maximumPoolSize がゼロ以下の場合、または corePoolSize が maximumPoolSize より大きい場合
NullPointerException
- workQueue または handler が null の場合public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
corePoolSize
- プール内に保持するスレッドの数 (アイドル状態のスレッドも含む)maximumPoolSize
- プールで許可されるスレッドの最大数keepAliveTime
- スレッドの数がコアよりも多い場合、これは、超過したアイドル状態のスレッドが終了前に新規タスクを待機する最大時間になるunit
- keepAliveTime 引数の時間単位workQueue
- タスクを実行する前に、タスク保持に使用するキュー。このキューは、execute メソッドにより送信された Runnable タスクだけを保持するthreadFactory
- executor が新規スレッドを作成する際に使用するファクトリhandler
- スレッドが制限に達するか、キューが容量に達したために実行がブロックされた場合に使用するハンドラ
IllegalArgumentException
- corePoolSize または keepAliveTime がゼロ未満の場合、maximumPoolSize がゼロ以下の場合、または corePoolSize が maximumPoolSize より大きい場合
NullPointerException
- workQueue、threadFactory、または handler が null の場合メソッドの詳細 |
---|
public void execute(Runnable command)
command
- 実行するタスク
RejectedExecutionException
- タスクを実行用に受け入れることができない場合、RejectedExecutionHandler の判断でスローされる
NullPointerException
- コマンドが null の場合public void shutdown()
SecurityException
- セキュリティマネージャが存在する状況でシャットダウンを実行すると、この ExecutorService が呼び出し側には変更を許可されないスレッドを操作できる場合。これは、RuntimePermission
("modifyThread") を保持しないか、セキュリティマネージャの checkAccess メソッドがアクセスを拒否するためであるpublic List<Runnable> shutdownNow()
この実装は Thread.interrupt()
を介してタスクを取り消します。このため、いずれかのタスクがマスクを実行するか、割り込みへの応答に失敗すると、そのタスクが決して終了しなくなる可能性があります。
SecurityException
- セキュリティマネージャが存在する状況でシャットダウンを実行すると、この ExecutorService が呼び出し側には変更を許可されないスレッドを操作できる場合。これは、RuntimePermission
("modifyThread") を保持しないか、セキュリティマネージャの checkAccess メソッドがアクセスを拒否するためであるpublic boolean isShutdown()
ExecutorService
の記述:
public boolean isTerminating()
public boolean isTerminated()
ExecutorService
の記述:
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
ExecutorService
の記述:
timeout
- 待機する最長時間unit
- timeout 引数の時間単位
InterruptedException
- 待機中に割り込みが発生した場合protected void finalize()
Object
内の finalize
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()
setRejectedExecutionHandler(java.util.concurrent.RejectedExecutionHandler)
public BlockingQueue<Runnable> getQueue()
public boolean remove(Runnable task)
このメソッドは、取り消しスキーマの一部として有効に使用できます。内部キューに配置される前に他の形式に変換されたタスクは、削除に失敗する場合があります。たとえば、submit を使用して入力されたタスクは、Future 状態を維持する形式に変換される可能性があります。ただし、この場合は、purge()
メソッドを使用してこれらの取り消された Future を削除できます。
task
- 削除するタスク
public void purge()
Future
タスクすべての削除を試みます。このメソッドは、機能に他の影響を及ぼすことのない記憶領域の再生操作に役立ちます。取り消されたタスクは決して実行されませんが、ワーカスレッドがこれらをアクティブに削除できるようになるまで作業キューに蓄積されます。このメソッドを呼び出すと、それらの削除をただちに試みます。ただし、他のスレッドからの干渉が存在する場合、このメソッドはタスクの削除に失敗する可能性があります。
public void setCorePoolSize(int corePoolSize)
corePoolSize
- 新規コアサイズ
IllegalArgumentException
- corePoolSize がゼロ未満の場合getCorePoolSize()
public int getCorePoolSize()
setCorePoolSize(int)
public boolean prestartCoreThread()
public int prestartAllCoreThreads()
public void setMaximumPoolSize(int maximumPoolSize)
maximumPoolSize
- 新しい最大値
IllegalArgumentException
- maximumPoolSize がゼロ未満またはコアプールサイズ
の場合getMaximumPoolSize()
public int getMaximumPoolSize()
setMaximumPoolSize(int)
public void setKeepAliveTime(long time, TimeUnit unit)
time
- 待機時間。時間値がゼロの場合、超過したスレッドはタスクの実行後ただちに終了するunit
- time 引数の時間単位
IllegalArgumentException
- 時間がゼロ未満の場合getKeepAliveTime(java.util.concurrent.TimeUnit)
public long getKeepAliveTime(TimeUnit unit)
unit
- 期待される結果の時間単位
setKeepAliveTime(long, java.util.concurrent.TimeUnit)
public int getPoolSize()
public int getActiveCount()
public int getLargestPoolSize()
public long getTaskCount()
public long getCompletedTaskCount()
protected void beforeExecute(Thread t, Runnable r)
t
- タスク r を実行するスレッドr
- 実行されるタスクprotected void afterExecute(Runnable r, Throwable t)
r
- 完了した runnablet
- 終了の原因となった例外。実行が正常に完了した場合は nullprotected void terminated()
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。