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 (#getPoolSize を参照) と maximumPoolSize (#getCorePoolSize を参照) によって設定された境界に従ってプール サイズを自動的に調整します (#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優先度とデーモン以外の状態のスレッドをすべて同じThreadGroupに作成するNORM_PRIORITYが使用されます。 別の ThreadFactory を指定することで、スレッドの名前、スレッド グループ、優先度、デーモンの状態などを変更できます。ThreadFactoryから null を返して要求されたときにnewThreadがスレッドの作成に失敗した場合、Executor は続行されますが、タスクを実行できない可能性があります。 スレッドには "modifyThread" RuntimePermissionが必要です。 ワーカー スレッドまたはプールを使用する他のスレッドがこのアクセス許可を持っていない場合、サービスが低下する可能性があります。構成の変更はタイムリーに有効にならない可能性があり、シャットダウン プールは終了は可能だが完了していない状態のままである可能性があります</dd>
<dt>Keep-alive 時間</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>
キューには、 <ol という 3 つの一般的な方法があります。>
<li><em> Direct handoffs.</em> 作業キューの適切な既定の選択肢は、タスクを保持せずにスレッドにタスクを提供する SynchronousQueue です。 ここでは、タスクをすぐに実行できるスレッドがない場合、タスクをキューに登録しようとすると失敗するため、新しいスレッドが構築されます。 このポリシーは、内部依存関係を持つ可能性がある要求のセットを処理するときに、ロックアップを回避します。 直接ハンドオフでは、通常、送信された新しいタスクが拒否されないように、無制限の maximumPoolSizes が必要です。 これにより、コマンドが処理できるよりも平均して速く到着し続けると、無制限のスレッドが増加する可能性が認められます。
<li><em> バインドされていないキュー.</em> バインドされていないキュー (定義済みの容量のない LinkedBlockingQueue など) を使用すると、すべての corePoolSize スレッドがビジー状態のときに新しいタスクがキューで待機します。 したがって、corePoolSize スレッド以上のスレッドは作成されません。 (したがって、maximumPoolSize の値には影響はありません)。これは、各タスクが他のタスクから完全に独立している場合に適しているため、タスクが互いの実行に影響を与えることはできません。たとえば、Web ページ サーバーの場合などです。 このスタイルのキューは、要求の一時的なバーストをスムーズ化するのに役立ちますが、コマンドが処理できるよりも平均して速く到着し続けると、無制限の作業キューの増加の可能性が認められます。
<li><em>Bounded queues.</em> 有界キュー (たとえば、 ArrayBlockingQueue) は、有限の maximumPoolSizes で使用する場合にリソースの枯渇を防ぐのに役立ちますが、調整と制御がより困難になる可能性があります。 キュー のサイズとプールの最大サイズは互いにトレードオフになる可能性があります。大きなキューと小さなプールを使用すると、CPU 使用率、OS リソース、コンテキスト切り替えのオーバーヘッドが最小限に抑えられますが、人為的にスループットが低下する可能性があります。 タスクが頻繁にブロックされる場合 (I/O バインドされている場合など)、システムは、他の方法で許可されているよりも多くのスレッドの時間をスケジュールできる可能性があります。 通常、小さなキューを使用するには、プール サイズを大きくする必要があります。これによって CPU の負荷は高くなりますが、許容できないスケジュールのオーバーヘッドが発生する可能性があり、スループットも低下します。
</ol>
</dd>
<dt>Rejected タスク</dt>
<dd> Executor がシャットダウンされたとき、および Executor が最大スレッドと作業キュー容量の両方に有限の境界を使用し、飽和状態になっている場合、メソッド #execute(Runnable) で送信された新しいタスクは <em>rejected</em> になります。 どちらの場合も、execute メソッドはRejectedExecutionHandler#rejectedExecution(Runnable, ThreadPoolExecutor)のRejectedExecutionHandler メソッドを呼び出します。 次の 4 つの定義済みハンドラー ポリシーが提供されます。
<ol>
<li>既定の ThreadPoolExecutor.AbortPolicyでは、ハンドラーは拒否時にランタイム RejectedExecutionException をスローします。
<li>ThreadPoolExecutor.CallerRunsPolicyでは、execute自体を呼び出すスレッドがタスクを実行します。 これにより、新しいタスクが送信される速度を遅くする簡単なフィードバック制御メカニズムが提供されます。
<li>ThreadPoolExecutor.DiscardPolicyでは、実行できないタスクは単純に削除されます。 このポリシーは、タスクの完了が決して依存しないまれなケースに対してのみ設計されています。
<li> executor ThreadPoolExecutor.DiscardOldestPolicy がシャットダウンされていない場合、作業キューの先頭にあるタスクが削除され、実行が再試行されます (これは再度失敗する可能性があり、これが繰り返されます)。このポリシーを受け入れることはほとんどありません。 ほとんどの場合、タスクを取り消して、完了を待機しているコンポーネントで例外を発生させたり、エラーをログに記録したりする必要 ThreadPoolExecutor.DiscardOldestPolicy 。
</ol>
他の種類の RejectedExecutionHandler クラスを定義して使用することができます。 これを行うには、特にポリシーが特定の容量またはキュー ポリシーでのみ機能するように設計されている場合は、注意が必要です。
</dd>
<dt>Hook メソッド</dt>
<dd>このクラスは、各タスク protected 実行の前後に呼び出されるオーバーライド可能な #beforeExecute(Thread, Runnable) メソッドと #afterExecute(Runnable, Throwable) メソッドを提供します。 これらは、実行環境を操作するために使用できます。たとえば、ThreadLocals の再初期化、統計の収集、ログ エントリの追加などです。 さらに、メソッド #terminated をオーバーライドして、Executor が完全に終了した後に実行する必要がある特別な処理を実行できます。
フック、コールバック、または BlockingQueue メソッドが例外をスローすると、内部ワーカー スレッドが失敗し、突然終了し、置き換えられる可能性があります</dd>
<dt>Queue maintenance</dt>
<dd>Method #getQueue() を使用すると、監視とデバッグのために作業キューにアクセスできます。 他の目的でこの方法を使用することは強くお勧めしません。 多数のキューに置かれたタスクが取り消されたときにストレージの再利用を支援するために、 #remove(Runnable) と #purge の 2 つのメソッドが用意されています</dd>
<dt>Reclamation</dt>
<dd><em>AND</em> プログラムで参照されなくなったプールは、明示的にシャットダウンすることなく、残りのスレッドを回収 (ガベージ コレクション) することはできません。 0 個のコア スレッドの下限を使用して適切なキープアライブ時間を設定したり、 #allowCoreThreadTimeOut(boolean)を設定したりすることで、未使用のすべてのスレッドが最終的に終了するようにプールを構成できます。
</dd>
</dl>
<b>Extension example.</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 で追加されました。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
| 名前 | 説明 |
|---|---|
| ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue, IRejectedExecutionHandler) |
指定された初期パラメーターと Executors#defaultThreadFactory 既定のスレッド ファクトリを使用して、新しい |
| ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue, IThreadFactory, IRejectedExecutionHandler) |
指定された初期パラメーターを使用して新しい |
| ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue, IThreadFactory) |
指定された初期パラメーターと ThreadPoolExecutor を使用して新しい |
| ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue) |
指定された初期パラメーターである Executors#defaultThreadFactory 既定のスレッド ファクトリと ThreadPoolExecutor を使用して、新しい |
| ThreadPoolExecutor(IntPtr, JniHandleOwnership) |
JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。 |
プロパティ
| 名前 | 説明 |
|---|---|
| ActiveCount |
タスクをアクティブに実行しているスレッドの概数を返します。 |
| Class |
この |
| CompletedTaskCount |
実行が完了したタスクのおおよその合計数を返します。 |
| CorePoolSize |
スレッドのコア数を返します。 または、スレッドのコア数を設定します。 |
| Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
| IsShutdown | |
| IsTerminated | |
| IsTerminating |
この Executor が |
| JniIdentityHashCode |
相互運用ランタイムによってこのJava ピアに割り当てられた ID ハッシュ コードを取得します。 (継承元 Object) |
| JniManagedPeerState |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| JniPeerMembers |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| LargestPoolSize |
プール内に同時に存在したスレッドの最大数を返します。 |
| MaximumPoolSize |
許容されるスレッドの最大数を返します。 または、許容されるスレッドの最大数を設定します。 |
| PeerReference |
このJava ピアの JNI オブジェクト参照を取得します。 (継承元 Object) |
| 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) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| Dispose() |
このJava ピアによって保持されているリソースを解放します。 (継承元 Object) |
| Dispose(Boolean) |
このJava ピアによって保持されているリソースを解放します。 (継承元 Object) |
| DisposeUnlessReferenced() |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| Equals(Object) |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
| Execute(IRunnable) |
将来、特定のタスクを実行します。 |
| GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
| GetKeepAliveTime(TimeUnit) |
スレッドのキープアライブ時間を返します。これは、スレッドが終了する前にアイドル状態のままになる可能性がある時間です。 |
| InvokeAll(ICollection, Int64, TimeUnit) |
特定のタスクを実行し、すべての完了またはタイムアウトが経過した時点で、どちらか早く発生したときに、その状態と結果を保持する Futures の一覧を返します。 (継承元 AbstractExecutorService) |
| InvokeAll(ICollection) |
指定されたタスクを実行し、すべての完了時に、その状態と結果を保持する先物の一覧を返します。 (継承元 AbstractExecutorService) |
| InvokeAny(ICollection, Int64, TimeUnit) |
指定されたタイムアウトが経過する前に完了したタスク (つまり、例外をスローせずに) の結果を返して、指定されたタスクを実行します。 (継承元 AbstractExecutorService) |
| InvokeAny(ICollection) |
指定されたタスクを実行し、正常に完了したタスクの結果を返します (例外をスローしない場合)。 (継承元 AbstractExecutorService) |
| JavaFinalize() |
古い.
オブジェクトへの参照がなくなったとガベージ コレクションによって判断されたときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
| NewTaskFor(ICallable) |
指定された呼び出し可能なタスクの |
| NewTaskFor(IRunnable, Object) |
指定された実行可能値と既定値の |
| Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドを起動します。 (継承元 Object) |
| NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドを起動します。 (継承元 Object) |
| PrestartAllCoreThreads() |
すべてのコア スレッドを開始し、作業を待ちます。 |
| PrestartCoreThread() |
コア スレッドを開始し、作業を idly 待機させます。 |
| Purge() |
取り消されたすべての |
| Remove(IRunnable) |
このタスクが存在する場合は、Executor の内部キューから削除されるため、まだ開始されていない場合は実行されません。 |
| SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
| SetKeepAliveTime(Int64, TimeUnit) |
スレッドのキープアライブ時間を設定します。これは、スレッドが終了する前にアイドル状態のままになる可能性がある時間です。 |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| Shutdown() |
以前に送信されたタスクが実行される順序付けされたシャットダウンを開始しますが、新しいタスクは受け入れなくなります。 |
| ShutdownNow() |
アクティブに実行されているすべてのタスクを停止し、待機中のタスクの処理を停止し、実行を待機していたタスクの一覧を返します。 |
| Submit(ICallable) |
値を返すタスクを実行用に送信し、タスクの保留中の結果を表す Future を返します。 (継承元 AbstractExecutorService) |
| Submit(IRunnable, Object) |
実行可能タスクを実行用に送信し、そのタスクを表す Future を返します。 (継承元 AbstractExecutorService) |
| Submit(IRunnable) |
実行可能タスクを実行用に送信し、そのタスクを表す Future を返します。 (継承元 AbstractExecutorService) |
| Terminated() |
Executor が終了したときに呼び出されるメソッド。 |
| ToArray<T>() |
このJava配列ラッパーからマネージド配列を作成します。 (継承元 Object) |
| ToString() |
オブジェクトの文字列表現を返します。 (継承元 Object) |
| UnregisterFromRuntime() |
相互運用ランタイムからこのJava ピアの登録を解除します。 (継承元 Object) |
| Wait() |
現在のスレッドが起動するまで待機します。通常は、 <em>notified</em> または <em>interrupted</em>。 (継承元 Object) |
| Wait(Int64, Int32) |
現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。 (継承元 Object) |
| Wait(Int64) |
現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。 (継承元 Object) |
明示的なインターフェイスの実装
| 名前 | 説明 |
|---|---|
| IJavaPeerable.Disposed() |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| IJavaPeerable.Finalized() |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| IJavaPeerable.JniObjectReferenceControlBlock |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| IJavaPeerable.UnregisterFromRuntime() |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
拡張メソッド
| 名前 | 説明 |
|---|---|
| AwaitTerminationAsync(IExecutorService, Int64, TimeUnit) |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| GetJniTypeName(IJavaPeerable) |
インスタンス |
| InvokeAnyAsync(IExecutorService, ICollection, Int64, TimeUnit) |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| InvokeAnyAsync(IExecutorService, ICollection) |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| JavaAs<TResult>(IJavaPeerable) |
|
| JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
| JavaCast<TResult>(IJavaObject) |
複数のプールされたスレッドのいずれかを使用して送信された各タスクを実行する |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
|