Openjdk ThreadPoolExecutor
Openjdk Threadpoolexecutor
java.lang.Object java.util.concurrent.AbstractExecutorService java.util.concurrent.ThreadPoolExecutor
- 実装されているすべてのインターフェース:
-
エグゼキュータ 、
ExecutorService
- 直接既知のサブクラス:
ScheduledThreadPoolExecutor
public class ThreadPoolExecutor extends AbstractExecutorServiceNS
ExecutorService
通常は以下を使用して構成された、場合によっては複数のプールされたスレッドの1つを使用して、送信された各タスクを実行します。 遺言執行者
ファクトリメソッド。スレッドプールは、2つの異なる問題に対処します。通常、タスクごとの呼び出しオーバーヘッドが削減されるため、多数の非同期タスクを実行するときにパフォーマンスが向上します。また、スレッドプールは、スレッドを含む、コレクションの実行時に消費されるリソースを制限および管理する手段を提供します。タスク。各ThreadPoolExecutorは、完了したタスクの数など、いくつかの基本的な統計も保持します。
幅広いコンテキストで役立つように、このクラスは多くの調整可能なパラメーターと拡張性フックを提供します。ただし、プログラマーはより便利なものを使用することをお勧めします 遺言執行者
ファクトリメソッド Executors.newCachedThreadPool()
(無制限のスレッドプール、自動スレッド再利用付き)、 Executors.newFixedThreadPool(int)
(固定サイズのスレッドプール)および Executors.newSingleThreadExecutor()
(単一のバックグラウンドスレッド)、最も一般的な使用シナリオの設定を事前構成します。それ以外の場合は、このクラスを手動で構成および調整するときに、次のガイドを使用してください。
- コアおよび最大プールサイズ
- に
ThreadPoolExecutorは、プールサイズを自動的に調整します(を参照)
getPoolSize()
)corePoolSizeによって設定された境界に従って(を参照)getCorePoolSize()
)およびmaximumPoolSize(を参照)getMaximumPoolSize()
)。メソッドで新しいタスクが送信されたときexecute(実行可能)
、実行中のスレッドがcorePoolSize未満の場合、他のワーカースレッドがアイドル状態であっても、要求を処理するために新しいスレッドが作成されます。それ以外の場合、実行されているスレッドがmaximumPoolSize未満の場合、キューがいっぱいの場合にのみ要求を処理するために新しいスレッドが作成されます。 corePoolSizeとmaximumPoolSizeを同じに設定することで、固定サイズのスレッドプールを作成します。 maximumPoolSizeを次のような本質的に無制限の値に設定するInteger.MAX_VALUEを使用すると、プールが任意の数の同時タスクに対応できるようになります。最も一般的には、コアと最大プールサイズは構築時にのみ設定されますが、を使用して動的に変更することもできます。
setCorePoolSize(int)
とsetMaximumPoolSize(int)
。 - オンデマンド建設
- デフォルトでは、コアスレッドでさえ最初に作成され、新しいタスクが到着したときにのみ開始されますが、これはメソッドを使用して動的にオーバーライドできます
prestartCoreThread()
またprestartAllCoreThreads()
。空でないキューでプールを構築する場合は、スレッドを事前に開始することをお勧めします。 - 新しいスレッドの作成
- 新しいスレッドは、
ThreadFactory
。特に指定のない限り、Executors.defaultThreadFactory()
が使用され、すべてが同じになるスレッドが作成されますThreadGroupと同じ
NORM_PRIORITY優先度と非デーモンステータス。別のThreadFactoryを指定することで、スレッドの名前、スレッドグループ、優先度、デーモンのステータスなどを変更できます。
からnullを返すことによって要求された場合、ThreadFactoryはスレッドの作成に失敗します
newThread、エグゼキュータは続行しますが、タスクを実行できない可能性があります。スレッドは「modifyThread」を所有している必要があります
RuntimePermission。プールを使用するワーカースレッドまたは他のスレッドがこの権限を持っていない場合、サービスが低下する可能性があります。構成の変更がタイムリーに有効にならず、シャットダウンプールが終了は可能であるが完了していない状態のままになる場合があります。
- キープアライブタイム
- プールに現在corePoolSizeを超えるスレッドがある場合、keepAliveTimeを超えてアイドル状態になっていると、余分なスレッドは終了します(を参照)。
getKeepAliveTime(TimeUnit)
)。これは、プールがアクティブに使用されていないときにリソース消費を削減する手段を提供します。後でプールがよりアクティブになると、新しいスレッドが構築されます。このパラメータは、メソッドを使用して動的に変更することもできますsetKeepAliveTime(long、TimeUnit)
。の値を使用するLong.MAX_VALUE
TimeUnit.NANOSECONDS
アイドル状態のスレッドがシャットダウンする前に終了するのを効果的に無効にします。デフォルトでは、キープアライブポリシーは、corePoolSizeスレッドを超えるスレッドがある場合にのみ適用されますが、メソッドallowCoreThreadTimeOut(boolean)
keepAliveTime値がゼロ以外である限り、このタイムアウトポリシーをコアスレッドにも適用するために使用できます。 - キューイング
- どれでも
BlockingQueue
送信されたタスクを転送および保持するために使用できます。このキューの使用は、プールのサイズ設定と相互作用します。- 実行されているスレッドがcorePoolSize未満の場合、エグゼキューターは常にキューイングよりも新しいスレッドの追加を優先します。
- corePoolSize以上のスレッドが実行されている場合、Executorは常に、新しいスレッドを追加するのではなく、リクエストをキューに入れることを優先します。
- リクエストをキューに入れることができない場合、maximumPoolSizeを超えない限り、新しいスレッドが作成されます。超えた場合、タスクは拒否されます。
- 直接ハンドオフ。 ワークキューのデフォルトの適切な選択は、
SynchronousQueue
タスクを他の方法で保持せずにスレッドに渡します。ここでは、タスクを実行するためにすぐに使用できるスレッドがない場合、タスクをキューに入れる試みは失敗するため、新しいスレッドが構築されます。このポリシーは、内部依存関係を持つ可能性のある一連のリクエストを処理する際のロックアップを回避します。直接ハンドオフでは、通常、新しく送信されたタスクの拒否を回避するために、無制限のmaximumPoolSizesが必要です。これにより、コマンドが処理可能な速度よりも平均して速く到着し続けると、スレッドが無制限に増加する可能性が認められます。 - 無制限のキュー。 無制限のキューを使用する(たとえば、
LinkedBlockingQueue
事前定義された容量がない場合)、すべてのcorePoolSizeスレッドがビジーの場合、新しいタスクがキューで待機します。したがって、corePoolSizeスレッドしか作成されません。 (したがって、maximumPoolSizeの値は効果がありません。)これは、各タスクが他のタスクから完全に独立している場合に適切である可能性があり、タスクが相互の実行に影響を与えることはありません。たとえば、Webページサーバーで。このスタイルのキューイングは、要求の一時的なバーストを平滑化するのに役立ちますが、コマンドが処理できるよりも平均して速く到着し続けると、無制限のワークキューが増加する可能性があります。 - 制限されたキュー。 制限付きキュー(たとえば、
ArrayBlockingQueue
)有限のmaximumPoolSizesで使用すると、リソースの枯渇を防ぐのに役立ちますが、調整と制御がより困難になる可能性があります。キューサイズと最大プールサイズは互いにトレードオフになる可能性があります。大きなキューと小さなプールを使用すると、CPU使用率、OSリソース、コンテキスト切り替えのオーバーヘッドが最小限に抑えられますが、スループットが人為的に低くなる可能性があります。タスクが頻繁にブロックされる場合(たとえば、タスクがI / Oバウンドである場合)、システムは、他の方法で許可されているよりも多くのスレッドの時間をスケジュールできる場合があります。小さなキューを使用すると、通常、より大きなプールサイズが必要になります。これにより、CPUはビジー状態に保たれますが、許容できないスケジューリングオーバーヘッドが発生し、スループットも低下する可能性があります。
- 拒否されたタスク
- メソッドで送信された新しいタスク
execute(実行可能)
になります 拒否されました エグゼキュータがシャットダウンされたとき、およびエグゼキュータが最大スレッドとワークキュー容量の両方に有限の境界を使用し、飽和状態になっているとき。いずれの場合も、executeメソッドはを呼び出します
RejectedExecutionHandler.rejectedExecution(Runnable、ThreadPoolExecutor)
その方法RejectedExecutionHandler
。 4つの事前定義されたハンドラーポリシーが提供されます。- デフォルトでは
ThreadPoolExecutor.AbortPolicy
、ハンドラーはランタイムをスローしますRejectedExecutionException
拒否されたとき。 - の
ThreadPoolExecutor.CallerRunsPolicy
、を呼び出すスレッド実行自体がタスクを実行します。これにより、新しいタスクが送信される速度を遅くする単純なフィードバック制御メカニズムが提供されます。
- の
ThreadPoolExecutor.DiscardPolicy
、実行できないタスクは単にドロップされます。 - の
ThreadPoolExecutor.DiscardOldestPolicy
、エグゼキュータがシャットダウンされていない場合、ワークキューの先頭にあるタスクがドロップされ、実行が再試行されます(これは再度失敗し、これが繰り返される可能性があります)。
RejectedExecutionHandler
クラス。ポリシーが特定の容量またはキューイングポリシーの下でのみ機能するように設計されている場合は特に、そうするために注意が必要です。 - デフォルトでは
- フックメソッド
- このクラスは提供します
保護されたオーバーライド可能
beforeExecute(スレッド、実行可能)
とafterExecute(Runnable、Throwable)
各タスクの実行の前後に呼び出されるメソッド。これらは、実行環境を操作するために使用できます。たとえば、ThreadLocalsの再初期化、統計の収集、ログエントリの追加などです。さらに、方法終了()
エグゼキュータが完全に終了した後に実行する必要がある特別な処理を実行するためにオーバーライドできます。フック、コールバック、またはBlockingQueueメソッドが例外をスローすると、内部ワーカースレッドが失敗し、突然終了し、場合によっては置き換えられる可能性があります。
- キューのメンテナンス
- 方法
getQueue()
監視とデバッグの目的でワークキューへのアクセスを許可します。この方法を他の目的に使用することは強くお勧めしません。提供される2つの方法、remove(実行可能)
とパージ()
キューに入れられた多数のタスクがキャンセルされた場合に、ストレージの再利用を支援するために使用できます。 - レクラメーション
- プログラムで参照されなくなったプール と 残りのスレッドがない場合は、明示的にシャットダウンせずに再利用(ガベージコレクション)できます。ゼロコアスレッドの下限を使用したり、設定したりして、適切なキープアライブ時間を設定することにより、未使用のすべてのスレッドが最終的に停止できるようにプールを構成できます。
allowCoreThreadTimeOut(boolean)
。
拡張例 。このクラスのほとんどの拡張機能は、1つ以上の保護されたフックメソッドをオーバーライドします。たとえば、単純な一時停止/再開機能を追加するサブクラスは次のとおりです。
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.AbortPolicy | をスローする拒否されたタスクのハンドラー RejectedExecutionException 。 |
静的クラス | ThreadPoolExecutor.CallerRunsPolicy | 拒否されたタスクを、の呼び出しスレッドで直接実行する、拒否されたタスクのハンドラーエグゼキュータがシャットダウンされていない限り、メソッドを実行します。シャットダウンされている場合、タスクは破棄されます。 |
静的クラス | ThreadPoolExecutor.DiscardOldestPolicy | 最も古い未処理の要求を破棄してから再試行する、拒否されたタスクのハンドラーエグゼキュータがシャットダウンされない限り、実行します。シャットダウンされた場合、タスクは破棄されます。 |
静的クラス | ThreadPoolExecutor.DiscardPolicy | 拒否されたタスクをサイレントに破棄する、拒否されたタスクのハンドラー。 |
コンストラクターの要約
ビルダー | 説明 |
---|---|
ThreadPoolExecutor (int corePoolSize、int maximumPoolSize、long keepAliveTime、 TimeUnit 単位、 BlockingQueue < Runnable >workQueue) | 新しいを作成します指定された初期パラメーター、デフォルトのスレッドファクトリ、およびデフォルトの拒否された実行ハンドラーを持つThreadPoolExecutor。 |
ThreadPoolExecutor (int corePoolSize、int maximumPoolSize、long keepAliveTime、 TimeUnit 単位、 BlockingQueue < Runnable >workQueue、 RejectedExecutionHandler ハンドラ) | 新しいを作成します指定された初期パラメータを持つThreadPoolExecutorと デフォルトのスレッドファクトリ 。 |
ThreadPoolExecutor (int corePoolSize、int maximumPoolSize、long keepAliveTime、 TimeUnit 単位、 BlockingQueue < Runnable >workQueue、 ThreadFactory threadFactory) | 新しいを作成します指定された初期パラメータを持つThreadPoolExecutorと デフォルトの拒否された実行ハンドラ 。 |
ThreadPoolExecutor (int corePoolSize、int maximumPoolSize、long keepAliveTime、 TimeUnit 単位、 BlockingQueue < Runnable >workQueue、 ThreadFactory threadFactory、 RejectedExecutionHandler ハンドラ) | 新しいを作成します指定された初期パラメーターを持つThreadPoolExecutor。 |
メソッドの概要
修飾子とタイプ | 方法 | 説明 |
---|---|---|
保護されたボイド | afterExecute (Runnable r、Throwable t) | 指定されたRunnableの実行の完了時に呼び出されるメソッド。 |
空所 | allowCoreThreadTimeOut (ブール値) | キープアライブ時間内にタスクが到着しない場合にコアスレッドがタイムアウトして終了し、新しいタスクが到着したときに必要に応じて置き換えられるかどうかを管理するポリシーを設定します。 |
ブール値 | allowCoreThreadTimeOut () | このプールでコアスレッドがタイムアウトし、keepAlive時間内にタスクが到着しない場合は終了し、新しいタスクが到着したときに必要に応じて置き換えられる場合はtrueを返します。 |
保護されたボイド | beforeExecute (スレッドt、実行可能r) | 指定されたスレッドで指定されたRunnableを実行する前に呼び出されるメソッド。 |
空所 | 実行する (実行可能なコマンド) | 将来、指定されたタスクを実行します。 |
保護されたボイド | ファイナライズ () | 非推奨。 |
int | getActiveCount () | タスクをアクティブに実行しているスレッドのおおよその数を返します。 |
長さ | getCompletedTaskCount () | 実行を完了したタスクのおおよその総数を返します。 |
int | getCorePoolSize () | スレッドのコア数を返します。 |
長さ | getKeepAliveTime (( TimeUnit 単位) | スレッドのキープアライブ時間を返します。これは、スレッドが終了する前にアイドル状態を維持できる時間です。 |
int | getLargestPoolSize () | プールに同時に存在したことのあるスレッドの最大数を返します。 |
int | getMaximumPoolSize () | スレッドの最大許容数を返します。 |
int | getPoolSize () | プール内の現在のスレッド数を返します。 |
BlockingQueue < Runnable > | getQueue () | このエグゼキュータが使用するタスクキューを返します。 |
RejectedExecutionHandler | getRejectedExecutionHandler () | 実行不可能なタスクの現在のハンドラーを返します。 |
長さ | getTaskCount () | これまでに実行がスケジュールされたタスクのおおよその総数を返します。 |
ThreadFactory | getThreadFactory () | 新しいスレッドの作成に使用されたスレッドファクトリを返します。 |
ブール値 | isTermination () | このエグゼキュータが後に終了するプロセスにある場合はtrueを返します シャットダウン() また shutdownNow() しかし、完全には終了していません。 |
int | prestartAllCoreThreads () | すべてのコアスレッドを開始し、アイドル状態で作業を待機させます。 |
ブール値 | prestartCoreThread () | コアスレッドを開始し、アイドル状態で作業を待機させます。 |
空所 | パージ () | すべてのワークキューから削除しようとします 未来 キャンセルされたタスク。 |
ブール値 | 削除する (実行可能なタスク) | このタスクが存在する場合は、エグゼキュータの内部キューから削除します。これにより、まだ開始されていない場合は実行されません。 |
空所 | setCorePoolSize (intcorePoolSize) | スレッドのコア数を設定します。 |
空所 | setKeepAliveTime (長い間、 TimeUnit 単位) | スレッドのキープアライブ時間を設定します。これは、スレッドが終了する前にアイドル状態を維持できる時間です。 |
空所 | setMaximumPoolSize (intmaximumPoolSize) | スレッドの最大許容数を設定します。 |
空所 | setRejectedExecutionHandler (( RejectedExecutionHandler ハンドラ) | 実行不可能なタスクの新しいハンドラーを設定します。 |
空所 | setThreadFactory (( ThreadFactory threadFactory) | 新しいスレッドの作成に使用されるスレッドファクトリを設定します。 |
空所 | シャットダウン () | 以前に送信されたタスクが実行される正常なシャットダウンを開始しますが、新しいタスクは受け入れられません。 |
リスト< Runnable > | shutdownNow () | アクティブに実行されているすべてのタスクの停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。 |
保護されたボイド | 終了しました () | エグゼキュータが終了したときに呼び出されるメソッド。 |
弦 | toString () | このプールとその状態を識別する文字列を返します。これには、実行状態、推定されるワーカー数とタスク数が含まれます。 |
クラスjava.util.concurrentで宣言されたメソッド。 AbstractExecutorService
newTaskFor 、 newTaskFor 、 参加する 、 参加する 、 参加する クラスjava.langで宣言されたメソッド。物体
clone、equals、getClass、hashCode、notify、notifyAll、wait、wait、waitインターフェイスjava.util.concurrentで宣言されたメソッド。 ExecutorService
awaitTermination 、 invokeAll 、 invokeAll 、 invokeAny 、 invokeAny 、 isShutdown 、 isTerminated コンストラクターの詳細
ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
新しいを作成します指定された初期パラメーター、デフォルトのスレッドファクトリ、およびデフォルトの拒否された実行ハンドラーを持つThreadPoolExecutor。のいずれかを使用する方が便利な場合があります 遺言執行者
この汎用コンストラクターの代わりにファクトリメソッド。
- パラメーター:
-
corePoolSize-アイドル状態であっても、プールに保持するスレッドの数。allowCoreThreadTimeOutが設定されています
-
maximumPoolSize-プールで許可するスレッドの最大数
-
keepAliveTime-スレッドの数がコアよりも多い場合、これは、過剰なアイドルスレッドが終了する前に新しいタスクを待機する最大時間です。
-
単位-の時間単位keepAliveTime引数
-
workQueue-タスクが実行される前にタスクを保持するために使用するキュー。このキューは、によって送信された実行可能なタスクメソッドを実行します。
- スロー:
-
IllegalArgumentException-次のいずれかが当てはまる場合:
corePoolSize<0
keepAliveTime<0
maximumPoolSize<= 0
maximumPoolSize -
NullPointerException-ifworkQueueがnullです
ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
新しいを作成します指定された初期パラメータを持つThreadPoolExecutorと デフォルトの拒否された実行ハンドラ 。 - パラメーター:
-
corePoolSize-アイドル状態であっても、プールに保持するスレッドの数。allowCoreThreadTimeOutが設定されています
-
maximumPoolSize-プールで許可するスレッドの最大数
-
keepAliveTime-スレッドの数がコアよりも多い場合、これは、過剰なアイドルスレッドが終了する前に新しいタスクを待機する最大時間です。
-
単位-の時間単位keepAliveTime引数
-
workQueue-タスクが実行される前にタスクを保持するために使用するキュー。このキューは、によって送信された実行可能なタスクメソッドを実行します。
-
threadFactory-エグゼキュータが新しいスレッドを作成するときに使用するファクトリ
- スロー:
-
IllegalArgumentException-次のいずれかが当てはまる場合:
corePoolSize<0
keepAliveTime<0
maximumPoolSize<= 0
maximumPoolSize -
NullPointerException-ifworkQueueまたはthreadFactoryがnull
ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
新しいを作成します指定された初期パラメータを持つThreadPoolExecutorと デフォルトのスレッドファクトリ 。 - パラメーター:
-
corePoolSize-アイドル状態であっても、プールに保持するスレッドの数。allowCoreThreadTimeOutが設定されています
-
maximumPoolSize-プールで許可するスレッドの最大数
-
keepAliveTime-スレッドの数がコアよりも多い場合、これは、過剰なアイドルスレッドが終了する前に新しいタスクを待機する最大時間です。
-
単位-の時間単位keepAliveTime引数
-
workQueue-タスクが実行される前にタスクを保持するために使用するキュー。このキューは、によって送信された実行可能なタスクメソッドを実行します。
-
ハンドラー-スレッドの境界とキューの容量に達したために実行がブロックされたときに使用するハンドラー
- スロー:
-
IllegalArgumentException-次のいずれかが当てはまる場合:
corePoolSize<0
keepAliveTime<0
maximumPoolSize<= 0
maximumPoolSize -
NullPointerException-ifworkQueueまたはハンドラーがnull
ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
新しいを作成します指定された初期パラメーターを持つThreadPoolExecutor。 - パラメーター:
-
corePoolSize-アイドル状態であっても、プールに保持するスレッドの数。allowCoreThreadTimeOutが設定されています
-
maximumPoolSize-プールで許可するスレッドの最大数
-
keepAliveTime-スレッドの数がコアよりも多い場合、これは、過剰なアイドルスレッドが終了する前に新しいタスクを待機する最大時間です。
-
単位-の時間単位keepAliveTime引数
-
workQueue-タスクが実行される前にタスクを保持するために使用するキュー。このキューは、によって送信された実行可能なタスクメソッドを実行します。
-
threadFactory-エグゼキュータが新しいスレッドを作成するときに使用するファクトリ
-
ハンドラー-スレッドの境界とキューの容量に達したために実行がブロックされたときに使用するハンドラー
- スロー:
-
IllegalArgumentException-次のいずれかが当てはまる場合:
corePoolSize<0
keepAliveTime<0
maximumPoolSize<= 0
maximumPoolSize -
NullPointerException-ifworkQueueまたはthreadFactoryまたはハンドラーがnull
メソッドの詳細
実行する
public void execute(Runnable command)
将来、指定されたタスクを実行します。タスクは、新しいスレッドまたは既存のプールされたスレッドで実行できます。このエグゼキュータがシャットダウンされたか、その容量に達したためにタスクを実行に移すことができない場合、タスクは現在のエグゼキュータによって処理されます。 RejectedExecutionHandler
。 - パラメーター:
-
コマンド-実行するタスク
- スロー:
-
RejectedExecutionException -の裁量でRejectedExecutionHandler、タスクの実行を受け入れることができない場合
-
NullPointerException-ifコマンドがnull
シャットダウン
public void shutdown()
以前に送信されたタスクが実行される正常なシャットダウンを開始しますが、新しいタスクは受け入れられません。すでにシャットダウンされている場合、呼び出しによる追加の効果はありません。このメソッドは、以前に送信されたタスクが実行を完了するのを待ちません。使用する awaitTermination
それをするために。
- スロー:
-
SecurityException-セキュリティマネージャーが存在し、このExecutorServiceをシャットダウンすると、保持されていないために呼び出し元が変更を許可されていないスレッドを操作する可能性がありますRuntimePermission( 'modifyThread')、またはセキュリティマネージャのcheckAccessメソッドはアクセスを拒否します。
shutdownNow
public List<Runnable> shutdownNow()
アクティブに実行されているすべてのタスクの停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。これらのタスクは、このメソッドから戻ると、タスクキューから排出(削除)されます。このメソッドは、アクティブに実行されているタスクが終了するのを待ちません。使用する awaitTermination
それをするために。
アクティブに実行されているタスクの処理を停止するための最善の試み以外の保証はありません。この実装は、を介してタスクを中断しますThread.interrupt();割り込みに応答しないタスクは、決して終了しない場合があります。
- 戻り値:
- 実行を開始したことがないタスクのリスト
- スロー:
-
SecurityException-セキュリティマネージャーが存在し、このExecutorServiceをシャットダウンすると、保持されていないために呼び出し元が変更を許可されていないスレッドを操作する可能性がありますRuntimePermission( 'modifyThread')、またはセキュリティマネージャのcheckAccessメソッドはアクセスを拒否します。
isTermination
public boolean isTerminating()
このエグゼキュータが後に終了するプロセスにある場合はtrueを返します シャットダウン()
また shutdownNow()
しかし、完全には終了していません。この方法は、デバッグに役立つ場合があります。のリターンtrueは、シャットダウン後の十分な期間が、送信されたタスクが中断を無視または抑制したことを示している可能性があり、このエグゼキュータが適切に終了しないことを報告しました。 - 戻り値:
-
終了しているがまだ終了していない場合はtrue
ファイナライズ
@Deprecated(since='9') protected void finalize()
非推奨。 クラスからコピーされた説明:物体
ガベージコレクションがオブジェクトへの参照がこれ以上ないと判断したときに、オブジェクトのガベージコレクターによって呼び出されます。サブクラスはシステムリソースを破棄するか、他のクリーンアップを実行するためのメソッドを完成させます。の一般契約ファイナライズとは、Java仮想マシンが、ファイナライズによって実行されたアクションの結果を除いて、まだ停止していないスレッドがこのオブジェクトにアクセスできる手段がないと判断した場合に呼び出されることです。ファイナライズの準備ができている他のオブジェクトまたはクラス。 NSfinalizeメソッドは、このオブジェクトを他のスレッドで再び使用できるようにするなど、任意のアクションを実行できます。の通常の目的ただし、ファイナライズは、オブジェクトが取り返しのつかないほど破棄される前にクリーンアップアクションを実行することです。たとえば、入出力接続を表すオブジェクトのfinalizeメソッドは、オブジェクトが完全に破棄される前に、明示的なI / Oトランザクションを実行して接続を切断する場合があります。
NSクラスのメソッドを完成させるオブジェクトは特別なアクションを実行しません。それは単に正常に戻ります。のサブクラスオブジェクトはこの定義を上書きする場合があります。
Javaプログラミング言語は、どのスレッドがを呼び出すかを保証しません。任意のオブジェクトのfinalizeメソッド。ただし、finalizeを呼び出すスレッドは、finalizeが呼び出されたときに、ユーザーに表示される同期ロックを保持しないことが保証されています。キャッチされなかった例外がfinalizeメソッドによってスローされた場合、例外は無視され、そのオブジェクトのファイナライズは終了します。
後にオブジェクトに対してfinalizeメソッドが呼び出されました。Java仮想マシンが、他のオブジェクトによる可能なアクションを含め、まだ停止していないスレッドがこのオブジェクトにアクセスできる手段がなくなったと再度判断するまで、それ以上のアクションは実行されません。ファイナライズの準備ができているオブジェクトまたはクラス。その時点で、オブジェクトは破棄される可能性があります。
NSfinalizeメソッドは、特定のオブジェクトに対してJava仮想マシンによって複数回呼び出されることはありません。
によってスローされた例外finalizeメソッドを使用すると、このオブジェクトのファイナライズが停止されますが、それ以外の場合は無視されます。
- オーバーライド:
-
クラスでファイナライズ物体
- 実装上の注意:
- このクラスの以前のバージョンには、このエグゼキュータをシャットダウンするfinalizeメソッドがありましたが、このバージョンでは、finalizeは何もしません。
- 関連項目:
-
WeakReference、ファントムリファレンス
setThreadFactory
public void setThreadFactory(ThreadFactory threadFactory)
新しいスレッドの作成に使用されるスレッドファクトリを設定します。 - パラメーター:
-
threadFactory-新しいスレッドファクトリ
- スロー:
-
NullPointerException-threadFactoryがnullの場合
- 関連項目:
-
getThreadFactory()
getThreadFactory
public ThreadFactory getThreadFactory()
新しいスレッドの作成に使用されたスレッドファクトリを返します。 - 戻り値:
- 現在のスレッドファクトリ
- 関連項目:
-
setThreadFactory(ThreadFactory)
setRejectedExecutionHandler
public void setRejectedExecutionHandler(RejectedExecutionHandler handler)
実行不可能なタスクの新しいハンドラーを設定します。 - パラメーター:
-
ハンドラー-新しいハンドラー
- スロー:
-
NullPointerException-ハンドラーがnullの場合
- 関連項目:
-
getRejectedExecutionHandler()
getRejectedExecutionHandler
public RejectedExecutionHandler getRejectedExecutionHandler()
実行不可能なタスクの現在のハンドラーを返します。 - 戻り値:
- 現在のハンドラー
- 関連項目:
-
setRejectedExecutionHandler(RejectedExecutionHandler)
setCorePoolSize
public void setCorePoolSize(int corePoolSize)
スレッドのコア数を設定します。これは、コンストラクターで設定された値をオーバーライドします。新しい値が現在の値よりも小さい場合、余分な既存のスレッドは、次にアイドル状態になったときに終了します。より大きくなると、必要に応じて、キューに入れられたタスクを実行するために新しいスレッドが開始されます。 - パラメーター:
-
corePoolSize-新しいコアサイズ
- スロー:
-
IllegalArgumentException-ifcorePoolSize<0 or corePoolSizeが 最大プールサイズ
- 関連項目:
-
getCorePoolSize()
getCorePoolSize
public int getCorePoolSize()
スレッドのコア数を返します。 - 戻り値:
- スレッドのコア数
- 関連項目:
-
setCorePoolSize(int)
prestartCoreThread
public boolean prestartCoreThread()
コアスレッドを開始し、アイドル状態で作業を待機させます。これは、新しいタスクが実行されたときにのみコアスレッドを開始するというデフォルトのポリシーを上書きします。このメソッドはすべてのコアスレッドがすでに開始されている場合はfalse。 - 戻り値:
-
スレッドが開始された場合はtrue
prestartAllCoreThreads
public int prestartAllCoreThreads()
すべてのコアスレッドを開始し、アイドル状態で作業を待機させます。これは、新しいタスクが実行されたときにのみコアスレッドを開始するというデフォルトのポリシーを上書きします。 - 戻り値:
- 開始されたスレッドの数
allowCoreThreadTimeOut
public boolean allowsCoreThreadTimeOut()
このプールでコアスレッドがタイムアウトし、keepAlive時間内にタスクが到着しない場合は終了し、新しいタスクが到着したときに必要に応じて置き換えられる場合はtrueを返します。 trueの場合、非コアスレッドに適用される同じキープアライブポリシーがコアスレッドにも適用されます。 false(デフォルト)の場合、着信タスクがないためにコアスレッドが終了することはありません。 - 戻り値:
-
コアスレッドがタイムアウトを許可されている場合はtrue、それ以外の場合はtrue。NS
- 以来:
- 1.6
allowCoreThreadTimeOut
public void allowCoreThreadTimeOut(boolean value)
キープアライブ時間内にタスクが到着しない場合にコアスレッドがタイムアウトして終了し、新しいタスクが到着したときに必要に応じて置き換えられるかどうかを管理するポリシーを設定します。 falseの場合、着信タスクがないためにコアスレッドが終了することはありません。 trueの場合、非コアスレッドに適用される同じキープアライブポリシーがコアスレッドにも適用されます。継続的なスレッド交換を回避するには、設定時にキープアライブ時間をゼロより大きくする必要がありますNS。このメソッドは通常、プールがアクティブに使用される前に呼び出す必要があります。 - パラメーター:
-
価値 -タイムアウトする必要がある場合はtrue、それ以外の場合はtrueNS
- スロー:
-
IllegalArgumentException-値がtrueであり、現在のキープアライブ時間はゼロ以下です
- 以来:
- 1.6
setMaximumPoolSize
public void setMaximumPoolSize(int maximumPoolSize)
スレッドの最大許容数を設定します。これは、コンストラクターで設定された値をオーバーライドします。新しい値が現在の値よりも小さい場合、余分な既存のスレッドは、次にアイドル状態になったときに終了します。 - パラメーター:
-
maximumPoolSize-新しい最大値
- スロー:
-
IllegalArgumentException-新しい最大値がゼロ以下の場合、または コアプールサイズ
- 関連項目:
-
getMaximumPoolSize()
getMaximumPoolSize
public int getMaximumPoolSize()
スレッドの最大許容数を返します。 - 戻り値:
- スレッドの最大許容数
- 関連項目:
-
setMaximumPoolSize(int)
setKeepAliveTime
public void setKeepAliveTime(long time, TimeUnit unit)
スレッドのキープアライブ時間を設定します。これは、スレッドが終了する前にアイドル状態を維持できる時間です。現在プールにあるスレッドのコア数を超える場合、またはこのプールが存在する場合、タスクを処理せずにこの時間待機するスレッドは終了します。 コアスレッドのタイムアウトを許可します 。これは、コンストラクターで設定された値をオーバーライドします。 - パラメーター:
-
時間-待つ時間。時間値がゼロの場合、タスクの実行直後に過剰なスレッドが終了します。
-
単位-の時間単位時間引数
- スロー:
-
IllegalArgumentException-ifゼロ未満の時間または時間はゼロであり、allowCoreThreadTimeOut
- 関連項目:
-
getKeepAliveTime(TimeUnit)
getKeepAliveTime
public long getKeepAliveTime(TimeUnit unit)
スレッドのキープアライブ時間を返します。これは、スレッドが終了する前にアイドル状態を維持できる時間です。現在プールにあるスレッドのコア数を超える場合、またはこのプールが存在する場合、タスクを処理せずにこの時間待機するスレッドは終了します。 コアスレッドのタイムアウトを許可します 。 - パラメーター:
-
unit-結果の希望する時間単位
- 戻り値:
- 制限時間
- 関連項目:
-
setKeepAliveTime(long、TimeUnit)
getQueue
public BlockingQueue<Runnable> getQueue()
このエグゼキュータが使用するタスクキューを返します。タスクキューへのアクセスは、主にデバッグと監視を目的としています。このキューはアクティブに使用されている可能性があります。タスクキューを取得しても、キューに入れられたタスクの実行が妨げられることはありません。 - 戻り値:
- タスクキュー
削除する
public boolean remove(Runnable task)
このタスクが存在する場合は、エグゼキュータの内部キューから削除します。これにより、まだ開始されていない場合は実行されません。この方法は、キャンセルスキームの一部として役立つ場合があります。内部キューに配置される前に他の形式に変換されたタスクの削除に失敗する場合があります。たとえば、を使用して入力されたタスク送信は、維持するフォームに変換される可能性があります将来の状況。ただし、そのような場合、方法 パージ()
キャンセルされたフューチャーを削除するために使用される場合があります。
- パラメーター:
-
task-削除するタスク
- 戻り値:
-
タスクが削除された場合はtrue
パージ
public void purge()
すべてのワークキューから削除しようとします 未来
キャンセルされたタスク。この方法は、機能に他の影響を与えないストレージ再利用操作として役立ちます。キャンセルされたタスクは実行されませんが、ワーカースレッドがアクティブに削除できるようになるまでワークキューに蓄積される可能性があります。このメソッドを呼び出すと、代わりにそれらを削除しようとします。ただし、この方法では、他のスレッドによる干渉がある場合、タスクの削除に失敗する可能性があります。getPoolSize
public int getPoolSize()
プール内の現在のスレッド数を返します。 - 戻り値:
- スレッドの数
getActiveCount
public int getActiveCount()
タスクをアクティブに実行しているスレッドのおおよその数を返します。 - 戻り値:
- スレッドの数
getLargestPoolSize
public int getLargestPoolSize()
プールに同時に存在したことのあるスレッドの最大数を返します。 - 戻り値:
- スレッドの数
getTaskCount
public long getTaskCount()
これまでに実行がスケジュールされたタスクのおおよその総数を返します。タスクとスレッドの状態は計算中に動的に変化する可能性があるため、戻り値は概算にすぎません。 - 戻り値:
- タスクの数
getCompletedTaskCount
public long getCompletedTaskCount()
実行を完了したタスクのおおよその総数を返します。タスクとスレッドの状態は計算中に動的に変化する可能性があるため、戻り値は概算にすぎませんが、連続する呼び出しで減少することはありません。 - 戻り値:
- タスクの数
toString
public String toString()
このプールとその状態を識別する文字列を返します。これには、実行状態、推定されるワーカー数とタスク数が含まれます。 - オーバーライド:
-
クラスのtoString物体
- 戻り値:
- このプールとその状態を識別する文字列
beforeExecute
protected void beforeExecute(Thread t, Runnable r)
指定されたスレッドで指定されたRunnableを実行する前に呼び出されるメソッド。このメソッドはスレッドによって呼び出されますタスクを実行するtrであり、ThreadLocalsを再初期化するため、またはロギングを実行するために使用できます。この実装は何もしませんが、サブクラスでカスタマイズできます。注:複数のオーバーライドを適切にネストするには、サブクラスは通常、を呼び出す必要がありますこのメソッドの最後にあるsuper.beforeExecute。
- パラメーター:
-
t-タスクを実行するスレッドNS
-
r-実行されるタスク
afterExecute
protected void afterExecute(Runnable r, Throwable t)
指定されたRunnableの実行の完了時に呼び出されるメソッド。このメソッドは、タスクを実行したスレッドによって呼び出されます。 null以外の場合、ThrowableはキャッチされませんRuntimeExceptionまたは実行が突然終了する原因となったエラー。この実装は何もしませんが、サブクラスでカスタマイズできます。注:複数のオーバーライドを適切にネストするには、サブクラスは通常、を呼び出す必要がありますこのメソッドの先頭にあるsuper.afterExecute。
ノート: アクションがタスクに含まれている場合( FutureTask
)明示的に、または次のような方法で送信すると、これらのタスクオブジェクトは計算上の例外をキャッチして維持するため、突然の終了は発生せず、内部例外は次のようになります。 いいえ このメソッドに渡されます。このメソッドで両方の種類の障害をトラップしたい場合は、タスクが中止された場合に直接の原因または根本的な例外のいずれかを出力するこのサンプルサブクラスのように、そのようなケースをさらに調査できます。
class ExtendedExecutor extends ThreadPoolExecutor { // ... protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); if (t == null && r instanceof Future<?> && ((Future<?>)r).isDone()) { try { Object result = ((Future<?>) r).get(); } catch (CancellationException ce) { t = ce; } catch (ExecutionException ee) { t = ee.getCause(); } catch (InterruptedException ie) { // ignore/reset Thread.currentThread().interrupt(); } } if (t != null) System.out.println(t); } }
- パラメーター:
-
r-完了したランナブル
-
t-終了の原因となった例外、または実行が正常に完了した場合はnull
終了しました
protected void terminated()
エグゼキュータが終了したときに呼び出されるメソッド。デフォルトの実装は何もしません。注:複数のオーバーライドを適切にネストするには、サブクラスは通常、を呼び出す必要がありますこのメソッド内でsuper.termitted。