ThreadPoolExecutor クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
通常は ExecutorService
ファクトリ メソッドを使用して構成された、プールされた複数のスレッドのいずれかを使用して、送信された各タスクを Executors
実行します。
[Android.Runtime.Register("java/util/concurrent/ThreadPoolExecutor", DoNotGenerateAcw=true)]
public class ThreadPoolExecutor : Java.Util.Concurrent.AbstractExecutorService
[<Android.Runtime.Register("java/util/concurrent/ThreadPoolExecutor", DoNotGenerateAcw=true)>]
type ThreadPoolExecutor = class
inherit AbstractExecutorService
- 継承
- 派生
- 属性
注釈
通常は ExecutorService
ファクトリ メソッドを使用して構成された、プールされた複数のスレッドのいずれかを使用して、送信された各タスクを Executors
実行します。
スレッド プールは 2 つの異なる問題に対処します。通常、タスクごとの呼び出しのオーバーヘッドが減るため、多数の非同期タスクを実行するとパフォーマンスが向上し、タスクのコレクションの実行時に使用されるスレッドを含むリソースを境界と管理する手段が提供されます。 また、完了 ThreadPoolExecutor
したタスクの数など、基本的な統計情報も保持されます。
このクラスは、さまざまなコンテキストで役立つ、多くの調整可能なパラメーターと拡張性フックを提供します。 ただし、プログラマは、最も一般的な使用シナリオで設定を事前に構成する、より便利な Executors
ファクトリ メソッド Executors#newCachedThreadPool
(無制限のスレッド プール、自動スレッドの再利用を Executors#newFixedThreadPool
使用)、(固定サイズのスレッド プール)、および Executors#newSingleThreadExecutor
(単一のバックグラウンド スレッド) を使用するように促されます。 それ以外の場合は、このクラスを手動で構成してチューニングする場合は、次のガイドを使用します。
<dl>
<dt>Core と最大プール サイズ</dt>
<dd>A ThreadPoolExecutor
は、corePoolSize (参照#getCorePoolSize
) と maximumPoolSize (参照) によって設定された境界に従ってプール サイズ (参照#getPoolSize
#getMaximumPoolSize
) を自動的に調整します。
メソッド #execute(Runnable)
で新しいタスクが送信されると、実行中の corePoolSize スレッドよりも少ない場合は、他のワーカー スレッドがアイドル状態であっても、要求を処理する新しいスレッドが作成されます。 それ以外の場合は、実行されている maximumPoolSize スレッドより少ない場合は、キューがいっぱいの場合にのみ、要求を処理する新しいスレッドが作成されます。 corePoolSize と maximumPoolSize を同じに設定することで、固定サイズのスレッド プールを作成します。 maximumPoolSize を本質的に無制限の値に Integer.MAX_VALUE
設定すると、プールは任意の数の同時実行タスクに対応できます。 ほとんどの場合、コア および最大プール サイズは構築時にのみ設定されますが、動的に#setCorePoolSize
#setMaximumPoolSize
変更することもできます。 </dd>
<dt>オンデマンド構築</dt>
<dd>既定では、コア スレッドも最初に作成され、新しいタスクが到着したときにのみ開始されますが、これはメソッド #prestartCoreThread
または #prestartAllCoreThreads
. 空でないキューを使用してプールを構築する場合は、スレッドを事前に開始する必要があります。 </dd>
<dt>新しいスレッド<の作成/dt>
<dd>新しいスレッドは、ThreadFactory
それ以外の場合は、Executors#defaultThreadFactory
a が使用され、すべてのスレッドが同じで、同じThreadGroup
NORM_PRIORITY
優先度とデーモン以外の状態に作成されます。 別の ThreadFactory を指定することで、スレッドの名前、スレッド グループ、優先度、デーモンの状態などを変更できます。 ThreadFactory
null newThread
を返すことによって要求されたときにスレッドの作成に失敗した場合、Executor は続行されますが、タスクを実行できない可能性があります。 スレッドには "modifyThread" RuntimePermission
が必要です。 ワーカー スレッドまたはプールを使用している他のスレッドがこのアクセス許可を持っていない場合、サービスが低下する可能性があります。構成の変更はタイムリーに有効にならない可能性があり、シャットダウン プールは終了は可能だが完了していない状態のままである可能性があります。</dd>
<dt>Keep-alive times</dt>
<dd>プールに現在 corePoolSize スレッドを超えるスレッドがある場合、余分なスレッドは keepAliveTime を超えてアイドル状態になっている場合に終了します (参照 #getKeepAliveTime(TimeUnit)
)。 これにより、プールがアクティブに使用されていないときにリソースの消費量を減らすことができます。 後でプールがよりアクティブになると、新しいスレッドが構築されます。 このパラメーターは、メソッド #setKeepAliveTime(long, TimeUnit)
を使用して動的に変更することもできます。 値を使用すると、アイドル状態の Long.MAX_VALUE
TimeUnit#NANOSECONDS
スレッドがシャットダウン前に終了するのを効果的に無効にします。 既定では、キープアライブ ポリシーは corePoolSize スレッドを超える場合にのみ適用されますが、keepAliveTime 値が 0 以外である限り、メソッド #allowCoreThreadTimeOut(boolean)
を使用してこのタイムアウト ポリシーをコア スレッドにも適用できます。 </dd>
<dt>Queuing</dt>
<dd>Any BlockingQueue
は、送信されたタスクを転送および保持するために使用できます。 このキューの使用は、プールのサイズ設定と対話します。
<ul>
<li>実行中の corePoolSize スレッドより少ない場合、Executor は常にキューではなく新しいスレッドを追加することを優先します。
<li>corePoolSize 以上のスレッドが実行されている場合、Executor は常に新しいスレッドを追加するのではなく、要求をキューに入れることを優先します。
<li>要求をキューに入れることができない場合、maximumPoolSize を超えない限り、新しいスレッドが作成されます。この場合、タスクは拒否されます。
</ul>
キューには、次の 3 つの一般的な方法があります <。>
<li><em> Direct ハンドオフ。</em> 作業キューの適切な既定の選択肢は、タスクを SynchronousQueue
保持せずにスレッドにハンドオフすることです。 ここでは、タスクをすぐに実行できるスレッドがない場合、タスクをキューに登録しようとすると失敗するため、新しいスレッドが構築されます。 このポリシーは、内部依存関係を持つ可能性がある要求のセットを処理するときに、ロックアップを回避します。 直接ハンドオフでは、通常、送信された新しいタスクが拒否されないように、無制限の maximumPoolSizes が必要です。 これにより、コマンドが処理できるよりも平均して速く到着し続けると、無制限のスレッドが増加する可能性が認められます。
<li><em> 無制限のキュー。</em> バインドされていないキュー (たとえば LinkedBlockingQueue
、事前に定義された容量がないキュー) を使用すると、すべての corePoolSize スレッドがビジー状態になると、新しいタスクがキュー内で待機します。 したがって、corePoolSize スレッド以上のスレッドは作成されません。 (したがって、maximumPoolSize の値には影響はありません)。これは、各タスクが他のタスクから完全に独立している場合に適しているため、タスクが互いの実行に影響を与えることはできません。たとえば、Web ページ サーバーの場合などです。 このスタイルのキューは、要求の一時的なバーストをスムーズ化するのに役立ちますが、コマンドが処理できるよりも平均して速く到着し続けると、無制限の作業キューが増加する可能性が認められます。
<li><em>Bounded キュー。</em> 境界付きキュー (例: an ArrayBlockingQueue
) は、有限の maximumPoolSizes で使用する場合にリソースの枯渇を防ぐのに役立ちますが、調整と制御がより困難になる可能性があります。 キュー のサイズとプールの最大サイズは互いにトレードオフになる可能性があります。大きなキューと小さなプールを使用すると、CPU 使用率、OS リソース、コンテキスト切り替えのオーバーヘッドが最小限に抑えられますが、人為的にスループットが低下する可能性があります。 タスクが頻繁にブロックされる場合 (I/O バインドされている場合など)、システムは、他の方法で許可されているよりも多くのスレッドの時間をスケジュールできる可能性があります。 通常、小さなキューを使用するには、プール サイズを大きくする必要があります。これによって CPU の負荷は高くなりますが、許容できないスケジュールのオーバーヘッドが発生する可能性があり、スループットも低下します。
</ol>
</dd>
<dt>Rejected tasks</dt>
<dd>メソッド#execute(Runnable)
で送信された<新しいタスクは><、Executor がシャットダウンされたとき、および Executor が最大スレッドと作業キュー容量の両方に有限の境界を使用し、飽和状態になると、拒否/em> になります。 どちらの場合も、このメソッドはそのexecute
メソッドのRejectedExecutionHandler
メソッドをRejectedExecutionHandler#rejectedExecution(Runnable, ThreadPoolExecutor)
呼び出します。 次の 4 つの定義済みハンドラー ポリシーが提供されます。
<ol>
<li>既定値 ThreadPoolExecutor.AbortPolicy
では、ハンドラーは拒否時にランタイム RejectedExecutionException
をスローします。
<li>In ThreadPoolExecutor.CallerRunsPolicy
では、それ自体を呼び出 execute
すスレッドがタスクを実行します。 これにより、新しいタスクが送信される速度を遅くする簡単なフィードバック制御メカニズムが提供されます。
<li>では ThreadPoolExecutor.DiscardPolicy
、実行できないタスクは単に削除されます。 このポリシーは、タスクの完了が決して依存しないまれなケースに対してのみ設計されています。
<li>In ThreadPoolExecutor.DiscardOldestPolicy
, executor がシャットダウンされていない場合、作業キューの先頭にあるタスクが削除され、実行が再試行されます (これは再度失敗する可能性があり、これが繰り返されます)。このポリシーを受け入れることはほとんどありません。 ほとんどの場合、タスクを取り消して、完了を待機しているコンポーネントで例外を発生させたり、エラーをログに ThreadPoolExecutor.DiscardOldestPolicy
記録したりする必要もあります(ドキュメントを参照)。
</ol>
他の種類の RejectedExecutionHandler
クラスを定義して使用することができます。 これを行うには、特にポリシーが特定の容量またはキュー ポリシーでのみ機能するように設計されている場合は、注意が必要です。 </dd>
<dt>Hook メソッド</dt>
<dd>このクラスは、各タスクの実行前と#afterExecute(Runnable, Throwable)
実行後に呼び出されるオーバーライド可能な#beforeExecute(Thread, Runnable)
メソッドを提供protected
します。 これらは、実行環境を操作するために使用できます。たとえば、ThreadLocals の再初期化、統計の収集、ログ エントリの追加などです。 さらに、Executor が完全に終了した後に実行する必要がある特別な処理を実行するためにメソッド #terminated
をオーバーライドできます。
フック、コールバック、または BlockingQueue メソッドが例外をスローすると、内部ワーカー スレッドが失敗し、突然終了し、置き換えられる可能性があります。</dd>
<dt>Queue maintenance</dt>
<dd>メソッド #getQueue()
を使用すると、監視とデバッグのために作業キューにアクセスできます。 他の目的でこの方法を使用することは強くお勧めしません。 2 つのメソッドが提供され#purge
、#remove(Runnable)
多数のキューに置かれたタスクが取り消されたときにストレージの再利用を支援するために使用できます。</dd>
<dt>Reclamation</dt>
<dd>プログラム <em>AND</em> で参照されなくなったプールにスレッドが残っていない場合は、明示的にシャットダウンせずに再利用 (ガベージ コレクション) できます。 ゼロ コア スレッドの下限または設定を使用して、適切なキープアライブ時間を設定することで、未使用のすべてのスレッドが最終的に死ぬようプールを構成 #allowCoreThreadTimeOut(boolean)
できます。 </dd>
</dl>
<b>拡張機能の例。</b> このクラスのほとんどの拡張機能は、保護されたフック メソッドの 1 つ以上をオーバーライドします。 たとえば、単純な一時停止/再開機能を追加するサブクラスを次に示します。
{@code
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 で追加されました。
の Java ドキュメントjava.util.concurrent.ThreadPoolExecutor
このページの一部は、Android オープンソース プロジェクトによって作成および共有され、クリエイティブ コモンズ 2.5 属性ライセンスに記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue) |
指定された初期パラメーター Executors#defaultThreadFactory の既定のスレッド ファクトリと ThreadPoolExecutor を使用して新しい |
ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue, IRejectedExecutionHandler) |
指定された初期パラメーターと Executors#defaultThreadFactory 既定のスレッド ファクトリを使用して新しい |
ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue, IThreadFactory) |
指定された初期パラメーターと ThreadPoolExecutor を使用して新しい |
ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue, IThreadFactory, IRejectedExecutionHandler) |
指定された初期パラメーターを使用して新しい |
ThreadPoolExecutor(IntPtr, JniHandleOwnership) |
JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。 |
プロパティ
ActiveCount |
タスクをアクティブに実行しているスレッドの概数を返します。 |
Class |
この |
CompletedTaskCount |
実行が完了したタスクのおおよその合計数を返します。 |
CorePoolSize |
スレッドのコア数を返します。 または、スレッドのコア数を設定します。 |
Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
IsShutdown |
通常は |
IsTerminated |
通常は |
IsTerminating |
この Executor が終了の処理中 |
JniIdentityHashCode |
通常は |
JniPeerMembers |
通常は |
LargestPoolSize |
プール内に同時に存在したスレッドの最大数を返します。 |
MaximumPoolSize |
許容されるスレッドの最大数を返します。 または、許容されるスレッドの最大数を設定します。 |
PeerReference |
通常は |
PoolSize |
プール内の現在のスレッド数を返します。 |
Queue |
この Executor によって使用されるタスク キューを返します。 |
RejectedExecutionHandler |
実行できないタスクの現在のハンドラーを返します。 または、実行できないタスクの新しいハンドラーを設定します。 |
TaskCount |
実行がスケジュールされたタスクのおおよその合計数を返します。 |
ThreadFactory |
新しいスレッドの作成に使用されるスレッド ファクトリを返します。 または、新しいスレッドの作成に使用するスレッド ファクトリを設定します。 |
ThresholdClass |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 |
ThresholdType |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 |
メソッド
AfterExecute(IRunnable, Throwable) |
指定された Runnable の実行が完了したときに呼び出されるメソッド。 |
AllowCoreThreadTimeOut(Boolean) |
キープアライブ時間内にタスクが到着しなかった場合にコア スレッドがタイムアウトして終了する可能性があるかどうかを制御するポリシーを設定します。新しいタスクが到着したときに必要に応じて置き換えられます。 |
AllowsCoreThreadTimeOut() |
このプールでコア スレッドがタイムアウトを許可し、keepAlive 時間内にタスクが到着しなかった場合は終了し、新しいタスクが到着したときに必要に応じて置き換えられる場合は true を返します。 |
AwaitTermination(Int64, TimeUnit) |
通常は |
AwaitTerminationAsync(Int64, TimeUnit) |
通常は |
BeforeExecute(Thread, IRunnable) |
指定されたスレッドで指定された Runnable を実行する前に呼び出されるメソッド。 |
Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
Dispose() |
通常は |
Dispose(Boolean) |
通常は |
Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
Execute(IRunnable) |
将来、特定のタスクを実行します。 |
GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
GetKeepAliveTime(TimeUnit) |
スレッドのキープアライブ時間を返します。これは、スレッドが終了する前にアイドル状態のままになる可能性がある時間です。 |
InvokeAll(ICollection) |
通常は |
InvokeAll(ICollection, Int64, TimeUnit) |
通常は |
InvokeAny(ICollection) |
通常は |
InvokeAny(ICollection, Int64, TimeUnit) |
通常は |
JavaFinalize() |
オブジェクトへの参照がなくなったとガベージ コレクションによって判断されたときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
NewTaskFor(ICallable) |
指定された呼び出し可能タスクの a |
NewTaskFor(IRunnable, Object) |
指定された実行可能値と既定値の a |
Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドを起動します。 (継承元 Object) |
NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドを起動します。 (継承元 Object) |
PrestartAllCoreThreads() |
すべてのコア スレッドを開始し、作業を待ちます。 |
PrestartCoreThread() |
コア スレッドを開始し、作業を idly 待機させます。 |
Purge() |
取り消されたすべての |
Remove(IRunnable) |
このタスクが存在する場合は、Executor の内部キューから削除されるため、まだ開始されていない場合は実行されません。 |
SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
SetKeepAliveTime(Int64, TimeUnit) |
スレッドのキープアライブ時間を設定します。これは、スレッドが終了する前にアイドル状態のままになる可能性がある時間です。 |
Shutdown() |
以前に送信されたタスクが実行される順序付けされたシャットダウンを開始しますが、新しいタスクは受け入れなくなります。 |
ShutdownNow() |
アクティブに実行されているすべてのタスクを停止し、待機中のタスクの処理を停止し、実行を待機していたタスクの一覧を返します。 |
Submit(ICallable) |
通常は |
Submit(IRunnable) |
実行可能タスクを実行用に送信し、そのタスクを表す Future を返します。 (継承元 AbstractExecutorService) |
Submit(IRunnable, Object) |
通常は |
Terminated() |
Executor が終了したときに呼び出されるメソッド。 |
ToArray<T>() |
通常は |
ToString() |
オブジェクトの文字列表現を返します。 (継承元 Object) |
UnregisterFromRuntime() |
通常は |
Wait() |
現在のスレッドが目覚めるまで待機させます。通常<は、通知<>/em> または <em>割り込み/em> を受け<取ります。 (継承元 Object) |
Wait(Int64) |
現在のスレッドが目覚めるまで待機します。通常<><は、通知/em> または <em>中断</em> によって、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
Wait(Int64, Int32) |
現在のスレッドが目覚めるまで待機します。通常<><は、通知/em> または <em>中断</em> によって、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
明示的なインターフェイスの実装
IJavaPeerable.Disposed() |
通常は |
IJavaPeerable.DisposeUnlessReferenced() |
通常は |
IJavaPeerable.Finalized() |
通常は |
IJavaPeerable.JniManagedPeerState |
通常は |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
通常は |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
通常は |
IJavaPeerable.SetPeerReference(JniObjectReference) |
通常は |
拡張メソッド
JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
JavaCast<TResult>(IJavaObject) |
通常は |
GetJniTypeName(IJavaPeerable) |
通常は |
AwaitTerminationAsync(IExecutorService, Int64, TimeUnit) |
通常は |
InvokeAnyAsync(IExecutorService, ICollection) |
通常は |
InvokeAnyAsync(IExecutorService, ICollection, Int64, TimeUnit) |
通常は |