モジュール java.base
パッケージ java.util.concurrent

クラスForkJoinPool

すべての実装されたインタフェース:
Executor, ExecutorService

public class ForkJoinPool
extends AbstractExecutorService
ForkJoinTaskを実行するためのExecutorService ForkJoinPoolは、ForkJoinTask以外のクライアントからの送信のほか、管理および監視操作のためのエントリ・ポイントを提供します。

ForkJoinPoolは、主にwork-stealingを使用する点で、他の種類のExecutorServiceとは異なります。プール内のすべてのスレッドが、プールに送信されたタスク、他のアクティブなタスクによって作成されたタスク、あるいはその両方を見つけて実行しようとします(1つも存在しない場合は、最終的に作業の待機がブロックされます)。 これにより、(ほとんどのForkJoinTaskと同様に)ほとんどのタスクが他のサブタスクを生成する場合や、外部のクライアントからプールに小さいタスクが数多く送信される場合に、効率的な処理が可能になります。 特に、コンストラクタでasyncModeをtrueに設定した場合、 ForkJoinPoolは結合されないイベント形式のタスクでの使用にも適している可能性があります。 すべてのワーカー・スレッドは、Thread.isDaemon() set trueで初期化されます。

静的commonPool()が利用可能であり、ほとんどの適用に適しています。 共通プールは、指定されたプールに明示的に送信されないForkJoinTaskで使用されます。 共通プールを使用すると、通常はリソースの使用量が減少します(そのスレッドは未使用時にゆっくりと回収され、その後の使用時に復帰します)。

個別または独自のプールを必要とする適用では、特定のターゲット並列性レベル(デフォルトでは使用可能なプロセッサの数と同じ)で ForkJoinPoolを構築できます。 このプールは、一部のタスクがほかのタスクの結合を待機して停止している場合でも、内部ワーカー・スレッドを動的に追加、中断、または再開することによって、十分な数のアクティブな(または使用可能な)スレッドを維持しようとします。 ただし、ブロックされた入出力やその他の管理されていない同期が存在する場合、このような調整は保証されません。 ネストされたForkJoinPool.ManagedBlockerインタフェースを使用すると、対応可能な同期の種類を拡張できます。 デフォルトのポリシーは、クラスThreadPoolExecutorに記述されているパラメータに対応するパラメータを持つコンストラクタを使用してオーバーライドできます。

実行およびライフ・サイクル制御メソッドに加えて、このクラスは、分岐/結合アプリケーションの開発、チューニング、および監視を支援することを目的にしたステータス・チェック・メソッド(たとえばgetStealCount())を提供します。 また、toString()メソッドも、プール状態の指示を非公式の監視に便利な形式で返します。

ほかのExecutorServiceと同様に、次の表に要約されている3つの主なタスク実行メソッドがあります。 これらは主に、現在のプール内の分岐/結合計算にまだ関与していないクライアントによって使用されるように設計されています。 これらのメソッドのメインの形式はForkJoinTaskのインスタンスを受け入れますが、オーバーロードされた形式では、プレーンな RunnableまたはCallableベースのアクティビティの混在実行も許可されます。 ただし、すでにプール内で実行されているタスクでは、通常結合されない非同期イベント形式のタスクを使用しないかぎり、通常はかわりにこの表に示されている計算内の形式を使用するようにしてください。その場合、選択するメソッドに違いはほとんどありません。

タスク実行メソッドのサマリー
分岐/結合以外のクライアントからの呼び出し 分岐/結合計算内からの呼び出し
非同期実行の調整 execute(ForkJoinTask) ForkJoinTask.fork()
結果の待機および取得 invoke(ForkJoinTask) ForkJoinTask.invoke()
実行の調整およびFutureの取得 submit(ForkJoinTask) ForkJoinTask.fork() (ForkJoinTask Future)

共通プールを構築するために使用されるパラメータは、次のシステム・プロパティを設定することで制御できます:

システム・プロパティを介してスレッド・ファクトリが提供されていない場合、共通プールは、システム・クラス・ローダーを使用するファクトリを「スレッド・コンテキスト・クラス・ローダー」として使用します。 さらに、SecurityManagerが存在する場合、共通プールは、Permissionsが有効になっていないスレッドを提供するファクトリを使用します。 これらの設定時にエラーが発生した場合は、デフォルト・パラメータが使用されます。 並列性プロパティをゼロに設定するか、nullを返すことができるファクトリを使用するか、あるいはその両方によって、共通プール内のスレッドの使用を無効化または制限できます。 ただし、その場合は、結合されていないタスクがまったく実行されなくなる可能性があります。

実装上のノート: この実装では、実行中のスレッドの最大数を32767に制限します。 最大数を超えるプールを作成しようとすると、IllegalArgumentExceptionが発生します。

この実装では、送信されたタスクを(RejectedExecutionExceptionをスローすることによって)拒否するのは、プールがシャットダウンされているか、または内部リソースが使い果たされた場合だけです。

導入されたバージョン:
1.7
  • フィールド詳細

    • defaultForkJoinWorkerThreadFactory

      public static final ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory
      新しいForkJoinWorkerThreadを作成します。 このファクトリは、ForkJoinPoolコンストラクタでオーバーライドされないかぎり使用されます。
  • コンストラクタの詳細

    • ForkJoinPool

      public ForkJoinPool()
      他のすべてのパラメータ(ForkJoinPool(int, ForkJoinWorkerThreadFactory, UncaughtExceptionHandler, boolean, int, int, int, Predicate, long, TimeUnit)を参照してください)のデフォルトを使用して、Runtime.availableProcessors()に等しい並列性を持つForkJoinPoolを作成します。
      例外:
      SecurityException - セキュリティ・マネージャが存在し、呼出し元がRuntimePermission("modifyThread")を持たないためスレッドを変更できない場合
    • ForkJoinPool

      public ForkJoinPool​(int parallelism)
      他のすべてのパラメータ(ForkJoinPool(int, ForkJoinWorkerThreadFactory, UncaughtExceptionHandler, boolean, int, int, int, Predicate, long, TimeUnit)を参照してください)のデフォルトを使用して、示された並列レベルでForkJoinPoolを作成します。
      パラメータ:
      parallelism - 並列性レベル
      例外:
      IllegalArgumentException - 並列性がゼロ以下か、実装限界より大きい
      SecurityException - セキュリティ・マネージャが存在し、呼出し元がRuntimePermission("modifyThread")を持たないためスレッドを変更できない場合
    • ForkJoinPool

      public ForkJoinPool​(int parallelism, ForkJoinPool.ForkJoinWorkerThreadFactory factory, Thread.UncaughtExceptionHandler handler, boolean asyncMode)
      指定されたパラメータ(他の人にデフォルトを使用-- ForkJoinPool(int, ForkJoinWorkerThreadFactory, UncaughtExceptionHandler, boolean, int, int, int, Predicate, long, TimeUnit)を参照してください)でForkJoinPoolを作成します。
      パラメータ:
      parallelism - 並列性レベル。 デフォルト値の場合、Runtime.availableProcessors()を使用します。
      factory - 新しいスレッドを作成するためのファクトリ。 デフォルト値の場合、defaultForkJoinWorkerThreadFactoryを使用します。
      handler - タスクの実行中に検出された回復不可能なエラーのために終了する内部ワーカー・スレッドのためのハンドラ。 デフォルト値の場合、nullを使用します。
      asyncMode - trueの場合は、結合されないフォークされたタスクに対して、ローカルの先入れ先出しスケジュール・モードを確立する。 このモードは、ワーカー・スレッドがイベント形式の非同期タスクのみを処理するアプリケーションでは、デフォルトのローカルのスタック・ベース・モードより適している場合がある。 デフォルト値の場合、falseを使用します。
      例外:
      IllegalArgumentException - 並列性がゼロ以下か、実装限界より大きい
      NullPointerException - ファクトリがnullの場合
      SecurityException - セキュリティ・マネージャが存在し、呼出し元がRuntimePermission("modifyThread")を持たないためスレッドを変更できない場合
    • ForkJoinPool

      public ForkJoinPool​(int parallelism, ForkJoinPool.ForkJoinWorkerThreadFactory factory, Thread.UncaughtExceptionHandler handler, boolean asyncMode, int corePoolSize, int maximumPoolSize, int minimumRunnable, Predicate<? super ForkJoinPool> saturate, long keepAliveTime, TimeUnit unit)
      指定されたパラメータを使ってForkJoinPoolを作成します。
      パラメータ:
      parallelism - 並列性レベル。 デフォルト値の場合、Runtime.availableProcessors()を使用します。
      factory - 新しいスレッドを作成するためのファクトリ。 デフォルト値の場合、defaultForkJoinWorkerThreadFactoryを使用します。
      handler - タスクの実行中に検出された回復不可能なエラーのために終了する内部ワーカー・スレッドのためのハンドラ。 デフォルト値の場合、nullを使用します。
      asyncMode - trueの場合は、結合されないフォークされたタスクに対して、ローカルの先入れ先出しスケジュール・モードを確立する。 このモードは、ワーカー・スレッドがイベント形式の非同期タスクのみを処理するアプリケーションでは、デフォルトのローカルのスタック・ベース・モードより適している場合がある。 デフォルト値の場合、 falseを使用します。
      corePoolSize - プール内に保持するスレッドの数(経過したキープアライブ後にタイムアウトしない限り)。 通常、(デフォルトで)この値は並列レベルと同じ値ですが、タスクが定期的にブロックされると動的オーバーヘッドを減らすために大きな値に設定されます。 より小さい値の(例えば0)を使用すると、デフォルトと同じ効果があります。
      maximumPoolSize - 許容されるスレッドの最大数。 最大値に達すると、ブロックされたスレッドの置換が失敗します。 (ただし、異なるスレッドの作成と終了が重複し、特定のスレッド・ファクトリによって管理される可能性があるため、この値は一時的に超過することがあります。) 共通プールにデフォルトで使用されているのと同じ値を設定するには、256parallelismレベルを使用します。 (デフォルトでは、共通プールは最大256のスペア・スレッドを許可します。) 実装全体のスレッド制限より大きい値(例えば Integer.MAX_VALUE)を使用すると、この制限値(これはデフォルトです)を使用するのと同じ効果があります。
      minimumRunnable - joinまたはForkJoinPool.ManagedBlockerによってブロックされないコア・スレッドの最小許容数。 進捗を確実にするために、ブロックされていないスレッドが少なすぎて未実行のタスクが存在する場合、指定されたmaximumPoolSizeまで新しいスレッドが構築されます。 デフォルト値は、 1を使用してください。 値を大きくすると、ブロックされたアクティビティがある場合にスループットが向上する可能性がありますが、オーバーヘッドが増えるためそうではありません。 送信されたタスクが、追加のスレッドを必要とする依存関係を持つことができない場合、ゼロの値は許容可能です。
      saturate - 非nullの場合、最大許容スレッド数を超えて作成しようとすると呼び出される述語。 デフォルトでは、スレッドがjoinまたはForkJoinPool.ManagedBlockerでブロックしようとしているが、maximumPoolSizeを超えて置換できない場合は、RejectedExecutionExceptionがスローされます。 しかし、この述語がtrueを返した場合、例外はスローされないため、プールは実行可能スレッドの目標数よりも少ない数で実行され続けます。
      keepAliveTime - スレッドが終了する前の最後の使用からの経過時間(必要に応じて後で交換)。 デフォルト値は、60, TimeUnit.SECONDSを使用してください。
      unit - keepAliveTime引数の時間単位
      例外:
      IllegalArgumentException - 並列性がゼロ以下、または実装の制限より大きい場合、またはmaximumPoolSizeが並列性よりも小さい場合、keepAliveTimeがゼロ以下である場合。
      NullPointerException - ファクトリがnullの場合
      SecurityException - セキュリティ・マネージャが存在し、呼出し元がRuntimePermission("modifyThread")を持たないためスレッドを変更できない場合
      導入されたバージョン:
      9
  • メソッドの詳細

    • commonPool

      public static ForkJoinPool commonPool()
      共通プール・インスタンスを返します。 このプールは静的に構築されます。shutdown()またはshutdownNow()を試行しても、その実行状態には影響しません。 ただし、このプールおよび実行中の処理は、System.exit(int)プログラムで自動的に終了します。 プログラムの終了前に非同期タスクの処理が完了することに依存するプログラムは、終了前にcommonPool().awaitQuiescenceを呼び出す必要があります。
      戻り値:
      共通プール・インスタンス
      導入されたバージョン:
      1.8
    • invoke

      public <T> T invoke​(ForkJoinTask<T> task)
      指定されたタスクを実行し、完了時にその結果を返します。 計算で非チェック例外またはエラーが発生した場合は、それが、この呼出しの結果として再スローされます。 再スローされた例外は通常の例外と同じように動作しますが、可能な場合は、現在のスレッドと実際に例外が発生しているスレッドの両方(最小限としては後者のみ)の(たとえば、ex.printStackTrace()を使用して表示された)スタック・トレースを含みます。
      型パラメータ:
      T - タスクの結果の型
      パラメータ:
      task - タスク
      戻り値:
      タスクの結果
      例外:
      NullPointerException - タスクがnullの場合
      RejectedExecutionException - タスクの実行をスケジュールできない場合
    • execute

      public void execute​(ForkJoinTask<?> task)
      指定されたタスクの(非同期)実行を調整します。
      パラメータ:
      task - タスク
      例外:
      NullPointerException - タスクがnullの場合
      RejectedExecutionException - タスクの実行をスケジュールできない場合
    • execute

      public void execute​(Runnable task)
      インタフェースからコピーされた説明: Executor
      将来のどの時点かで、指定されたコマンドを実行します。 コマンドは、新規スレッド内でも、プールされたスレッド内でも、呼出し側のスレッド内でも、Executor実装により随意に実行できます。
      パラメータ:
      task - 実行可能なタスク
      例外:
      NullPointerException - タスクがnullの場合
      RejectedExecutionException - タスクの実行をスケジュールできない場合
    • submit

      public <T> ForkJoinTask<T> submit​(ForkJoinTask<T> task)
      実行用のForkJoinTaskを送信します。
      型パラメータ:
      T - タスクの結果の型
      パラメータ:
      task - 送信するタスク
      戻り値:
      タスク
      例外:
      NullPointerException - タスクがnullの場合
      RejectedExecutionException - タスクの実行をスケジュールできない場合
    • submit

      public <T> ForkJoinTask<T> submit​(Callable<T> task)
      インタフェースからコピーされた説明: ExecutorService
      値を返す実行用タスクを送信して、保留状態のタスク結果を表すFutureを返します。 Futureのgetメソッドは、正常に完了した時点でタスクの結果を返します。

      タスクの待機をただちにブロックする場合は、result = exec.submit(aCallable).get();の形式の構築を使用できます。

      ノート: Executorsクラスには、クロージャに似たほかの一般オブジェクトを変換できるメソッド・セットが含まれます。たとえば、PrivilegedActionCallable形式に変換して、送信可能にすることができます。

      定義:
      submit、インタフェース: ExecutorService
      オーバーライド:
      submit、クラス: AbstractExecutorService
      型パラメータ:
      T - タスクの結果の型
      パラメータ:
      task - 送信するタスク
      戻り値:
      タスクの保留完了を表すFuture
      例外:
      NullPointerException - タスクがnullの場合
      RejectedExecutionException - タスクの実行をスケジュールできない場合
    • submit

      public <T> ForkJoinTask<T> submit​(Runnable task, T result)
      インタフェースからコピーされた説明: ExecutorService
      実行用のRunnableタスクを送信し、そのタスクを表すFutureを返します。 Futureのgetメソッドは、正常に完了した時点で指定された結果を返します。
      定義:
      submit、インタフェース: ExecutorService
      オーバーライド:
      submit、クラス: AbstractExecutorService
      型パラメータ:
      T - 結果の型
      パラメータ:
      task - 送信するタスク
      result - 返す結果
      戻り値:
      タスクの保留完了を表すFuture
      例外:
      NullPointerException - タスクがnullの場合
      RejectedExecutionException - タスクの実行をスケジュールできない場合
    • submit

      public ForkJoinTask<?> submit​(Runnable task)
      インタフェースからコピーされた説明: ExecutorService
      実行用のRunnableタスクを送信し、そのタスクを表すFutureを返します。 Futureのgetメソッドは、正常に完了した時点でnullを返します。
      定義:
      submit、インタフェース: ExecutorService
      オーバーライド:
      submit、クラス: AbstractExecutorService
      パラメータ:
      task - 送信するタスク
      戻り値:
      タスクの保留完了を表すFuture
      例外:
      NullPointerException - タスクがnullの場合
      RejectedExecutionException - タスクの実行をスケジュールできない場合
    • invokeAll

      public <T> List<Future<T>> invokeAll​(Collection<? extends Callable<T>> tasks)
      インタフェースからコピーされた説明: ExecutorService
      指定されたタスクを実行し、すべて完了すると、ステータスと結果を含むFutureのリストを返します。 返されるリストの各要素に対してFuture.isDone()trueになります。 完了したタスクは、通常どおりか例外をスローすることで終了しています。 オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。
      型パラメータ:
      T - タスクから返される値の型
      パラメータ:
      tasks - タスクのコレクション
      戻り値:
      タスクを表すFutureのリスト。リストの順序は、指定されたタスク・リストのイテレータにより生成される順序と同じで、各タスクは完了済みです。
      例外:
      NullPointerException - タスクまたはそのいずれかの要素がnullの場合
      RejectedExecutionException - いずれかのタスクの実行をスケジュールできない場合
    • getFactory

      新規ワーカーの構築に使用されるファクトリを返します。
      戻り値:
      新しいワーカーの構築に使用されるファクトリ
    • getUncaughtExceptionHandler

      public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
      タスクを実行中に発生した回復不能なエラーが原因で終了した内部ワーカー・スレッド用のハンドラを返します。
      戻り値:
      ハンドラ。ない場合はnull
    • getParallelism

      public int getParallelism()
      このプールのターゲット並列性レベルを返します。
      戻り値:
      このプールのターゲット並列性レベル
    • getCommonPoolParallelism

      public static int getCommonPoolParallelism()
      共通プールのターゲット並列性レベルを返します。
      戻り値:
      共通プールのターゲット並列性レベル
      導入されたバージョン:
      1.8
    • getPoolSize

      public int getPoolSize()
      開始したがまだ終了していないワーカー・スレッド数を返します。 このメソッドによって返された結果は、ほかのスレッドが協調してブロックされているときに並列性を維持するためにスレッドが作成された場合のgetParallelism()とは異なる可能性があります。
      戻り値:
      ワーカー・スレッド数
    • getAsyncMode

      public boolean getAsyncMode()
      結合されないフォークされたタスクについて、このプールがローカルの先入れ先出しスケジュール・モードを使用している場合、trueを返します。
      戻り値:
      このプールが非同期モードを使用している場合はtrue
    • getRunningThreadCount

      public int getRunningThreadCount()
      タスクの結合またはその他の管理対象同期の待機をブロックしない、ワーカー・スレッドの推定数を返します。 このメソッドは、実行中のスレッドの数を過大評価する可能性があります。
      戻り値:
      ワーカー・スレッド数
    • getActiveThreadCount

      public int getActiveThreadCount()
      現在タスクを横取りまたは実行しているスレッドの推定数を返します。 このメソッドは、アクティブなスレッドの数を過大評価する可能性があります。
      戻り値:
      アクティブなスレッドの数
    • isQuiescent

      public boolean isQuiescent()
      すべてのワーカー・スレッドが現在アイドル状態の場合にtrueを返します。 アイドル・ワーカーとは、ほかのスレッドから横取りできるタスクがなく、プールへの保留中の送信も存在しないために、実行するタスクを取得できないワーカーのことです。 このメソッドは控えめです。すべてのスレッドがアイドルになってもすぐにはtrueを返さない可能性がありますが、スレッドが非アクティブのままであれば、最終的にはtrueになります。
      戻り値:
      すべてのスレッドが現在アイドル状態の場合はtrue
    • getStealCount

      public long getStealCount()
      送信者以外のスレッドによって実行された完了済タスクの合計数の推定値を返します。 プールが静止していない場合、報告された値は、横取りの実際の総数を過小評価しています。 この値は、分岐/結合プログラムの監視やチューニングに役立つことがあります。一般に、横取りの数はスレッドのビジー状態を維持できるだけの十分に大きな値であるべきですが、スレッド間のオーバーヘッドや競合を回避できるだけの十分に小さな値でもあるべきです。
      戻り値:
      横取りの数
    • getQueuedTaskCount

      public long getQueuedTaskCount()
      ワーカー・スレッドによって現在キューに保持されているタスクの総数の推定値を返します(プールに送信された、まだ開始されていないタスクは含まない)。 この値は、プール内のすべてのスレッドにわたって反復することによって取得された近似値に過ぎません。 このメソッドは、タスクの粒度のチューニングに役立つことがあります。
      戻り値:
      キューに入っているタスクの数
    • getQueuedSubmissionCount

      public int getQueuedSubmissionCount()
      このプールに送信された、まだ実行が開始されていないタスクの推定数を返します。 このメソッドは、送信の数に比例して時間がかかることがあります。
      戻り値:
      キューに入っている送信の数
    • hasQueuedSubmissions

      public boolean hasQueuedSubmissions()
      このプールに送信された、まだ実行が開始されていないタスクがある場合はtrueを返します。
      戻り値:
      キューに入っている送信がない場合はtrue
    • pollSubmission

      protected ForkJoinTask<?> pollSubmission()
      まだ実行されていない次の送信が使用可能な場合、それを削除して復帰します。 このメソッドは、複数のプールを含むシステムで作業を再割り当てする、このクラスへの拡張機能で役立つことがあります。
      戻り値:
      次の送信。ない場合はnull
    • drainTasksTo

      protected int drainTasksTo​(Collection<? super ForkJoinTask<?>> c)
      実行されなかった、送信およびフォークされた使用可能なすべてのタスクをスケジュール・キューから削除し、実行ステータスを変更せずにそれらを指定されたコレクションに追加します。 これらには、人為的に生成またはラップされたタスクが含まれる可能性があります。 このメソッドは、プールが静止していることがわかっている場合にのみ呼び出されるように設計されています。 その他のときに呼び出すと、すべてのタスクが削除されないことがあります。 コレクションcに要素を追加しようとしているときに障害が検出されると、関連付けられた例外がスローされたときに、要素がどちらのコレクションにも存在しない場合と、どちらかまたは両方のコレクションに存在する場合があります。 オペレーションの進行中に、指定されたコレクションが変更された場合の、このオペレーションの動作は定義されていません。
      パラメータ:
      c - 要素の転送先のコレクション
      戻り値:
      転送された要素の数
    • toString

      public String toString()
      実行状態、並列性レベル、およびワーカーおよびタスク・カウントの指示を含めて、このプールおよびその状態を識別する文字列を返します。
      オーバーライド:
      toString 、クラス:  Object
      戻り値:
      このプールおよびその状態を識別する文字列
    • shutdown

      public void shutdown()
      可能であれば、順序正しくシャットダウンを開始します。以前に送信されたタスクは実行されますが、新規タスクは受け入れられません。 これがcommonPool()である場合は、呼び出しても実行状態に影響しません。また、シャットダウン後に呼び出しても効果はありません。 このメソッドの実行中に同時に送信されているタスクは拒否される場合と、されない場合があります。
      例外:
      SecurityException - セキュリティ・マネージャが存在し、呼出し元がRuntimePermission("modifyThread")を持たないためスレッドを変更できない場合
    • shutdownNow

      public List<Runnable> shutdownNow()
      可能であれば、すべてのタスクの取消しまたは停止(あるいはその両方)を行い、後で送信されたすべてのタスクを拒否することを試みます。 これがcommonPool()である場合は、呼び出しても実行状態に影響しません。また、シャットダウン後に呼び出しても効果はありません。 それ以外の場合、このメソッドの実行中に同時に送信または実行されているタスクは、拒否されることも、されないこともあります。 このメソッドは、タスクの依存関係が存在する場合に終了できるようにするために、既存のタスクと実行されなかったタスクの両方を取り消します。 そのため、このメソッドは(ほかの一部のExecutorの場合とは異なり)常に空のリストを返します。
      戻り値:
      空のリスト
      例外:
      SecurityException - セキュリティ・マネージャが存在し、呼出し元がRuntimePermission("modifyThread")を持たないためスレッドを変更できない場合
    • isTerminated

      public boolean isTerminated()
      シャットダウンに続いてすべてのタスクが完了していた場合、trueを返します。
      戻り値:
      シャットダウンに続いてすべてのタスクが完了していた場合はtrue
    • isTerminating

      public boolean isTerminating()
      終了処理が開始されたがまだ完了していない場合、trueを返します。 このメソッドはデバッグに便利なことがあります。 シャットダウン後、十分に時間が経ってから報告されたtrueの戻り値は、送信されたタスクが割込みを無視または抑制したか、あるいは入出力を待機しているために、このエグゼキュータが適切に終了されないことを示す可能性があります。 タスクは通常、ブロック操作を必要としてはいけないことを記載しているForkJoinTaskクラスのノートを参照してください。 ただし、必要としている場合は、割込みでそれを強制的に中止する必要があります。
      戻り値:
      終了中だが、まだ終了していない場合はtrue
    • isShutdown

      public boolean isShutdown()
      このプールがシャットダウンしていた場合、trueを返します。
      戻り値:
      このプールがシャットダウンされている場合はtrue
    • awaitTermination

      public boolean awaitTermination​(long timeout, TimeUnit unit) throws InterruptedException
      シャットダウン要求後にすべてのタスクが実行を完了していたか、タイム・アウトが発生するか、現在のスレッドで割込みが発生するか、そのいずれかが最初に発生するまでブロックします。 commonPool()はプログラムがシャットダウンするまで終了しないため、共通プールに適用した場合、このメソッドはawaitQuiescence(long, TimeUnit)と同等ですが、常にfalseを返します。
      パラメータ:
      timeout - 待機する最長時間
      unit - timeout引数の時間単位
      戻り値:
      このexecutorが終了した場合はtrue。終了前にタイム・アウトが経過した場合はfalse
      例外:
      InterruptedException - 待機中に割込みが発生した場合
    • awaitQuiescence

      public boolean awaitQuiescence​(long timeout, TimeUnit unit)
      このプール内で動作するForkJoinTaskから呼び出した場合は、ForkJoinTask.helpQuiesce()と同じ効果があります。 それ以外の場合は、このプールがisQuiescent()(静止状態)になるか、または指定されたタイムアウトが経過するまで、待機またはタスクの実行の支援(あるいはその両方)を試みます。
      パラメータ:
      timeout - 待機する最長時間
      unit - timeout引数の時間単位
      戻り値:
      静止状態の場合はtrue、タイム・アウトが経過した場合はfalse
    • managedBlock

      public static void managedBlock​(ForkJoinPool.ManagedBlocker blocker) throws InterruptedException
      指定された潜在的ブロック・タスクを実行します。 ForkJoinPoolで実行中の場合、このメソッドは、アクティブにされるスペアスレッドを必要に応じて調整して、現在のスレッドがblocker.block()でブロックされている間の十分な並列性を確保する可能性があります。

      このメソッドは、いすれかのメソッドでtrueが返されるまで、blocker.isReleasable()およびblocker.block()の呼出しを繰り返します。 blocker.block()の呼出しは、falseを返すblocker.isReleasable()の呼出しが先行します。

      ForkJoinPoolで実行していない場合、このメソッドの動作は次と同等です

       
       while (!blocker.isReleasable())
         if (blocker.block())
           break;
      ForkJoinPoolで実行中の場合、まずプールを拡張して、blocker.block()の呼出し中に使用可能な十分な並列性を確保する必要があります。

      パラメータ:
      blocker - ブロッカ・タスク
      例外:
      InterruptedException - blocker.block()がそれを実行した場合