パッケージjava.util.concurrent
java.util.concurrent.locks
パッケージとjava.util.concurrent.atomic
パッケージも参照してください。
Executor
インタフェースExecutor
は、スレッドに似たカスタム・サブシステム(スレッド・プール、非同期入出力、軽量タスク・フレームワークなど)を定義するための、標準化された単純なインタフェースです。 使用している具象Executorクラスに応じて、タスクは新しく作成されたスレッド、既存のタスク実行スレッド、またはexecute
を呼び出すスレッドで、順次にまたは並行して実行されます。 ExecutorService
では、より完全な非同期タスク実行フレームワークが用意されています。 ExecutorServiceは、タスクのキューイングとスケジュール設定を管理し、制御されたシャットダウンを可能にします。 ScheduledExecutorService
サブインタフェースとそれに関連付けられたインタフェースは、遅延されたまたは定期的なタスク実行のサポートが追加されています。 ExecutorServiceには、Callable
(Runnable
に類似し、結果を生成)として表される任意の関数の非同期実行を調整するメソッドが用意されています。 Future
は、関数の結果を返したり、実行が完了したかどうかの判断を可能にしたりするほか、実行を取り消す方法を提供します。 RunnableFuture
は、run
メソッドを所有するFuture
で、実行時にその結果を設定します。
実装。 ThreadPoolExecutor
クラスとScheduledThreadPoolExecutor
クラスは、調整可能で、柔軟なスレッド・プールを提供します。 Executors
クラスには、もっとも一般的なExecutorの種類と設定のためのファクトリ・メソッドと、そのようなexecutorを使用するためのユーティリティ・メソッドがいくつかあります。 Executors
を基にしたその他のユーティリティには、Futureの一般的な拡張可能な実装を提供する具象クラスFutureTask
や、非同期タスクのグループの処理の調整を支援するExecutorCompletionService
などがあります。
ForkJoinPool
クラスは、主にForkJoinTask
とそのサブクラスのインスタンスを処理するために設計されたExecutorを提供します。 これらのクラスは、計算量の多い並行処理でしばしば適用される制限に従ったタスクで高いスループットを得る、work-stealingスケジューラを使用します。
キュー
ConcurrentLinkedQueue
クラスは、効率的でスケーラブルな、スレッド・セーフの非ブロックFIFOキューを提供します。 ConcurrentLinkedDeque
クラスとほぼ同じですが、Deque
インタフェースを追加でサポートします。
java.util.concurrent
内の5つの実装、つまりLinkedBlockingQueue
、ArrayBlockingQueue
、SynchronousQueue
、PriorityBlockingQueue
、およびDelayQueue
は、putとtakeのブロック・バージョンを定義する拡張されたBlockingQueue
インタフェースをサポートします。 さまざまなクラスで、プロデューサ - コンシューマ、メッセージング、並列タスク実行、関連する並行設計などに対するもっとも一般的な使用コンテキストを網羅します。
拡張されたTransferQueue
インタフェース、およびLinkedTransferQueue
実装では、プロデューサが必要に応じてそのコンシューマの待機をブロックできる、同期transfer
メソッド(および関連する機能)が導入されます。
BlockingDeque
インタフェースはBlockingQueue
を拡張して、FIFOとLIFO (スタック・ベース)の両方のオペレーションをサポートします。 LinkedBlockingDeque
クラスは、実装を提供します。
タイミング
TimeUnit
クラスは、タイムアウト・ベースのオペレーションの指定および制御に対して、複数の粒度(ナノ秒単位まで)を提供します。 パッケージのほとんどのクラスには、無期限に待機するオペレーションだけでなく、タイムアウト・ベースのオペレーションが含まれています。 タイム・アウトを使用するすべての場合で、タイム・アウト値は、メソッドがタイム・アウトしたことを示すまで待機する最小時間を指定します。 タイム・アウトの発生後できるだけ早くそれを検出するために、実装では「最大限の努力」を行います。 ただし、検出されたタイム・アウトからそのタイム・アウト後にスレッドが実際に再実行されるまでには、無期限に時間が経過することもあります。 タイムアウト・パラメータを受け入れるすべてのメソッドで、ゼロ以下の値をまったく待機しないものとして扱います。 「永遠に」待機するには、Long.MAX_VALUE
の値を使用できます。
シンクロナイザ
よく利用される特化された同期方法を支援するために5つのクラスがあります。Semaphore
は、従来の並行処理ツールです。CountDownLatch
は、非常に単純ですがよく使われるユーティリティで、指定された数のシグナル、イベント、または条件を保持するまでブロックします。CyclicBarrier
は、リセット可能な多用途の同期ポイントであり、一部の形式の並行プログラミングで有用です。Phaser
は、複数のスレッドにわたる段階的な計算を制御するために使用できる、より柔軟な形式のバリアーを提供します。Exchanger
では、2つのスレッドがランデブー・ポイントでオブジェクトを交換するようにできます。これは、いくつかのパイプライン設計で有用です。
並行処理コレクション
このパッケージでは、Queueのほかにも、マルチスレッド・コンテキストで使用するために設計されたCollection実装であるConcurrentHashMap
、ConcurrentSkipListMap
、ConcurrentSkipListSet
、CopyOnWriteArrayList
、およびCopyOnWriteArraySet
が提供されます。 特定のコレクションに多数のスレッドがアクセスすることが想定される場合は、通常、同期されたHashMap
よりもConcurrentHashMap
、同期されたTreeMap
よりもConcurrentSkipListMap
を使用することをお薦めします。 読み込みとトラバーサルの予想数がリストの更新数よりはるかに多い場合は、同期されたArrayList
よりCopyOnWriteArrayList
を使用することをお薦めします。
このパッケージの一部のクラスに使用される「Concurrent」接頭辞は、類似した「synchronized」クラスとは異なる点がいくつかあることを簡潔に表すためのものです。 たとえば、java.util.Hashtable
とCollections.synchronizedMap(new HashMap())
は同期されます。 しかし、ConcurrentHashMap
は並行です。 並行処理コレクションはスレッド・セーフですが、単一の排他ロックによる制御を受けません。 ConcurrentHashMapの特定のケースでは、同時に多数の同時読み取りと多数の並行書き込みを安全に許可します。 「synchronized」クラスは、コレクションへのすべてのアクセスを単一ロックで防ぐ必要がある場合に役立ちます。ただし、スケーラビリティは低下します。 一方、複数のスレッドが共通のコレクションにアクセスすることが予想される場合、通常は「concurrent」バージョンが適切です。 コレクションが共有されていない場合、または別のロックを保持しているときにのみコレクションにアクセス可能である場合は、同期されていないコレクションを使うことをお薦めします。
ほとんどの並行処理Collection実装(ほとんどのQueueを含む)は、それらのイテレータおよびスプリッテレータがフェイルファストのトラバーサルではなく弱一貫性を提供する点で、通常のjava.util
規則とも異なります。
- 他のオペレーションとの並行処理が可能です。
ConcurrentModificationException
をスローしません。- 構築時に存在した要素を1回しかトラバースしないことが保証されており、構築後の変更を反映することも可能です(ただし保証はされません)。
メモリー整合性特性
「Java言語仕様」の第17章 では、共有変数の読取りおよび書込みなど、メモリー操作に関するhappens-beforeの関係を定義しています。 あるスレッドによる書込みの結果が別のスレッドによる読取りで認識されることが保証されるのは、その書込み操作が読取り操作の前に発生(happens-before)した場合だけです。synchronized
構文とvolatile
構文のほか、Thread.start()
メソッドとThread.join()
メソッドがhappens-before関係を形成できます。 特に次の点が重要です。
- スレッド内の各アクションは、プログラムの順序であとに出てくる、そのスレッド内のどのアクションよりも前に発生します。
- モニターのロック解除(
synchronized
ブロックまたはメソッドの終了)は、同じモニターでの以降のどのロック(synchronized
ブロックまたはメソッドのエントリ)よりも前に発生します。 また、happens-before関係は推移的であるため、ロック解除の前のスレッドのすべてのアクションは、そのモニターをロックするあらゆるスレッドに続くすべてのアクションの前に発生します。 volatile
フィールドへの書込みは、その同じフィールドの以降のどの読み取りよりも前に発生します。volatile
フィールドの書き込みと読取りには、モニターのエントリおよび終了と同様のメモリー整合性効果がありますが、相互排他ロックは伴いません。- スレッド上の
start
の呼出しは、開始されたスレッド内のあらゆるアクションの前に発生します。 - スレッド内のすべてのアクションが、そのスレッド上の
join
からほかのスレッドが正常に復帰する前に発生します。
java.util.concurrent
とそのサブパッケージ内のすべてのクラスのメソッドは、これらの保証をより高いレベルの同期にまで拡張します。 特に次の点が重要です。
- オブジェクトを任意の並行処理コレクションに配置する前のスレッド内のアクションは、別のスレッド内のその要素へのアクセスまたはコレクションからの削除に続くアクションよりも前に発生します。
Runnable
をExecutor
に送信する前のスレッド内のアクションは、その実行が開始される前に発生します。ExecutorService
に送信されるCallables
についても同様です。Future
で表される非同期計算によって実行されるアクションは、別のスレッド内のFuture.get()
による結果の取得に続くアクションの前に発生します。Lock.unlock
、Semaphore.release
、CountDownLatch.countDown
などのシンクロナイザ「解放」メソッドの前のアクションは、別のスレッド内の同じシンクロナイザ・オブジェクトに対するLock.lock
、Semaphore.acquire
、Condition.await
、CountDownLatch.await
などの正常終了した「取得」メソッドに続くアクションの前に発生します。Exchanger
を介してオブジェクトを正常に交換するスレッドのペアごとに、各スレッド内のexchange()
の前のアクションは、もう一方のスレッド内の対応するexchange()
に続くアクションの前に発生します。CyclicBarrier.await
とPhaser.awaitAdvance
(およびそのバリアント)を呼び出す前のアクションは、バリアー・アクションによって実行されるアクションの前に発生し、そのバリアー・アクションによって実行されるアクションは、ほかのスレッド内の対応するawait
からの正常な復帰に続くアクションの前に発生します。
- Java言語仕様を参照してください:
-
17.4.5 Happens-before順序
- 導入されたバージョン:
- 1.5
-
クラス説明
ExecutorService
実行メソッドのデフォルト実装を提供します。配列に連動する、制限付きのブロッキング・キューです。要素の取得時に両端キューが空でなくなるまで待機したり、要素の格納時に両端キュー内に空きが生じるまで待機するブロック操作を追加でサポートしたりするDeque
です。要素の取得時にキューが空でなくなるまで待機したり、要素の格納時にキュー内に空きが生じるまで待機する操作を追加でサポートしたりするQueue
です。スレッドが故障状態にあるバリアーを待機しようとしているとき、または待機中にバリアーが故障状態になったときに、例外をスローします。Callable<V>結果を返し、例外をスローすることがあるタスクです。FutureTask
などの値を生成するタスクの結果を、そのタスクが取り消されたために取得できないことを示す例外です。明示的に(その値とステータスを設定して)完了できるFuture
です。その完了時に発生する依存関数およびアクションをサポートし、CompletionStage
として使用できます。async
メソッドによって生成された非同期タスクを識別するマーカー・インタフェースです。結果またはタスクを完了する過程でエラーまたはその他の例外が検出されたときにスローされる例外です。新しい非同期タスクの生成を、完了済みタスクの結果の消費から分離するサービスです。CompletionStageが完了したときにアクションの実行または値の計算を行う、非同期の可能性がある計算のステージです。ConcurrentHashMap<K,V> 取得の完全な同時性および予想される高い更新平行性をサポートするハッシュ・テーブルです。キーのSet
としてのConcurrentHashMapのビューです。オプションで、共通の値にマップすることによって追加を有効化できます。リンク・ノードに基づく、制限なしの並行両端キューです。リンク・ノードに基づく、制限なしのスレッドセーフなキューです。ConcurrentMap<K,V> スレッドの安全性と原子性の保証を提供するMap
です。NavigableMap
オペレーションをサポートするConcurrentMap
です。そのナビゲート可能なサブマップに対しては再帰的です。スケーラブルな並行ConcurrentNavigableMap
実装です。ConcurrentSkipListMap
に基づくスケーラブルな並行NavigableSet
実装です。基になる配列の新しいコピーを作成することにより、すべての推移的操作(add、
setなど)が実装されるArrayList
のスレッドセーフな変数です。
内部のCopyOnWriteArrayList
をすべてのオペレーションで使用するSet
です。ほかのスレッドで実行中の操作セットが完了するまで、1つ以上のスレッドを待機可能にする同期化支援機能です。トリガーされた時点で保留中のアクションが残っていない場合に実行される完了アクションを含むForkJoinTask
です。スレッド・セットのそれぞれが共通のバリアー・ポイントに達するまで待機することを可能にする同期化支援機能です。一定の遅延のあとに影響を受けるオブジェクトにマーク付けするための、混合スタイルのインタフェースです。DelayQueue<E extends Delayed>Delayed
要素の制限なしのブロッキング・キューで、遅延時間が経過後にのみ、要素を取得できます。Exchanger<V>スレッドをペアにして、ペア内の要素を交換できる同期ポイント。例外をスローすることによって中断したタスクの結果を取得しようとしたときにスローされる例外です。送信されたRunnable
タスクを実行するオブジェクトです。タスクの実行に、指定されたExecutor
を使用するCompletionService
です。このパッケージで定義されたExecutor
、ExecutorService
、ScheduledExecutorService
、ThreadFactory
、およびCallable
クラス用のファクトリおよびユーティリティ・メソッドです。Publishers
がSubscription
によって管理される1つ以上のSubscribers
によって消費されるアイテムを生成するフロー制御コンポーネントを確立するための相互関係のあるインタフェースと静的メソッド。Flow.Processor<T,R> サブスクライバとパブリッシャの両方として機能するコンポーネント。サブスクライブ者が受け取ったアイテム(および関連する制御メッセージ)のプロデューサ。メッセージのレシーバ。Flow.Publisher
とFlow.Subscriber
をリンクするメッセージ制御。ForkJoinTask
を実行するためのExecutorService
。新しいForkJoinWorkerThread
を作成するためのファクトリです。ForkJoinPool
内で実行中のタスクについての管理対象の並列性を拡張するためのインタフェースです。ForkJoinTask<V>ForkJoinPool
内で実行する抽象基底クラスです。ForkJoinPool
によって管理されるスレッドであり、ForkJoinTask
を実行します。Future<V>Future
は、非同期計算の結果を表します。FutureTask<V>取消し可能な非同期計算です。リンク・ノードに基づく、オプションで制限付きになるブロッキング両端キューです。リンク・ノードに基づく、オプションで制限付きになるブロッキング・キューです。リンク・ノードに基づく、制限なしのTransferQueue
です。再使用可能な同期化バリアーで、機能はCyclicBarrier
およびCountDownLatch
と同様ですが、より柔軟な使用方法をサポートします。クラスPriorityQueue
と同じ順序付けルールを使用するとともにブロッキング取得オペレーションを提供する、制限なしのブロッキング・キューです。結果の出ない再帰的なForkJoinTask
。結果を生成する再帰的なForkJoinTask
。タスクが実行対象として受け入れ不可能な場合に、Executor
によってスローされる例外です。ThreadPoolExecutor
で実行できないタスクのハンドラです。Runnable
であるScheduledFuture
です。指定された遅延時間後または定期的にコマンドを実行するようにスケジュールできるExecutorService
です。取消し可能な、遅延された結果生成アクションです。指定された遅延時間後または定期的にコマンドを実行するようにスケジュールできるThreadPoolExecutor
です。計数セマフォです。(non-null)アイテムを非同期で発行するFlow.Publisher
は、現在のサブスクライバが閉じられるまでそれを発行します。各挿入オペレーションが別のスレッドによる対応する削除オペレーションを待機する必要がある(およびその逆の) ブロッキング・キューです。要求に応じて新しいスレッドを作成するオブジェクトです。現在のスレッドに分離された乱数ジェネレータ(期間264)。プールされた複数のスレッドの1つを使用して送信された各タスクを実行するExecutorService
です。通常はExecutors
ファクトリ・メソッドを使用して構成されます。RejectedExecutionException
をスローする拒否されたタスクのハンドラです。executorがシャットダウンしていない場合に、execute
メソッドの呼出しスレッド内で、拒否されたタスクを直接実行する、拒否されたタスクのハンドラです。シャットダウンしている場合、タスクは破棄されます。executorがシャットダウンしていない場合に、もっとも古い未処理の要求を破棄してexecute
を再試行する、拒否されたタスクのハンドラです。シャットダウンしている場合、タスクは破棄されます。拒否されたタスクを通知なしで破棄する拒否されたタスクのハンドラです。ブロック操作がタイム・アウトしたときにスローされる例外です。TimeUnit
は、指定された粒度単位でデュレーションを表し、単位を変換したり、それらの単位でタイミングおよび遅延操作を実行したりするユーティリティ・メソッドを提供します。コンシューマが要素を受け取るまでプロデューサが待機するBlockingQueue
。