|
JavaTM Platform Standard Ed. 6 |
|||||||||
| 前のパッケージ 次のパッケージ | フレームあり フレームなし | |||||||||
参照先:
説明
| インタフェースの概要 | |
|---|---|
| BlockingDeque<E> | 要素の取得時に両端キューが空でなくなるまで待機したり、要素の格納時に両端キュー内に空きが生じるまで待機するブロック操作を追加でサポートしたりする Deque です。 |
| BlockingQueue<E> | 要素の取得時にキューが空でなくなるまで待機したり、要素の格納時にキュー内に空きが生じるまで待機する操作を追加でサポートする Queue です。 |
| Callable<V> | 結果を返し、例外をスローすることがあるタスクです。 |
| CompletionService<V> | 新しい非同期タスクの生成を、完了済みタスクの結果の消費から分離するサービスです。 |
| ConcurrentMap<K,V> | 追加の原子的 putIfAbsent、remove、および replace メソッドを提供する Map です。 |
| ConcurrentNavigableMap<K,V> | NavigableMap オペレーションをサポートする ConcurrentMap です。 |
| Delayed | 一定の遅延のあとに影響を受けるオブジェクトにマーク付けするための、混合スタイルのインタフェースです。 |
| Executor | 送信された Runnable タスクを実行するオブジェクトです。 |
| ExecutorService | 終了を管理するメソッド、および 1 つ以上の非同期タスクの進行状況を追跡する Future を生成できるメソッドを提供する Executor です。 |
| Future<V> | Future は、非同期計算の結果を表します。 |
| RejectedExecutionHandler | ThreadPoolExecutor で実行できないタスクのハンドラです。 |
| RunnableFuture<V> | Runnable である Future です。 |
| RunnableScheduledFuture<V> | Runnable である ScheduledFuture です。 |
| ScheduledExecutorService | 指定された遅延時間後または定期的にコマンドを実行するようにスケジュールできる ExecutorService です。 |
| ScheduledFuture<V> | 取り消し可能な、遅延された結果生成アクションです。 |
| ThreadFactory | 要求に応じて新しいスレッドを作成するオブジェクトです。 |
| クラスの概要 | |
|---|---|
| AbstractExecutorService | ExecutorService 実行メソッドのデフォルト実装を提供します。 |
| ArrayBlockingQueue<E> | 配列に連動するバウンド形式のブロッキングキューです。 |
| ConcurrentHashMap<K,V> | 取得の完全な同時性および予想される調整可能な更新平行性をサポートするハッシュテーブルです。 |
| ConcurrentLinkedQueue<E> | リンクノードに基づく、アンバウンド形式のスレッドセーフなキューです。 |
| ConcurrentSkipListMap<K,V> | スケーラブルな並行 ConcurrentNavigableMap 実装です。 |
| ConcurrentSkipListSet<E> | ConcurrentSkipListMap に基づくスケーラブルな並行 NavigableSet 実装です。 |
| CopyOnWriteArrayList<E> | 基になる配列の新しいコピーを作成することにより、すべての推移的操作 (add、set など) が実装される ArrayList のスレッドセーフな変数です。 |
| CopyOnWriteArraySet<E> | すべての操作で内部 CopyOnWriteArrayList を使用する Set。 |
| CountDownLatch | ほかのスレッドで実行中の操作セットが完了するまで、1 つ以上のスレッドを待機可能にする同期化支援機能です。 |
| CyclicBarrier | スレッドセットのそれぞれが共通のバリアーポイントに達するまで待機することを可能にする同期化支援機能です。 |
| DelayQueue<E extends Delayed> | Delayed 要素のアンバウンド形式のブロッキングキューで、遅延時間が経過後にのみ、要素を取得できます。 |
| Exchanger<V> | スレッドをペアにして、ペア内の要素を交換できる同期ポイント。 |
| ExecutorCompletionService<V> | タスクの実行に、指定された Executor を使用する CompletionService です。 |
| Executors | このパッケージで定義された Executor、ExecutorService、ScheduledExecutorService、ThreadFactory、および Callable クラス用のファクトリおよびユーティリティーメソッドです。 |
| FutureTask<V> | 取り消し可能な非同期計算です。 |
| LinkedBlockingDeque<E> | リンクノードに基づく、任意のバウンド形式のブロッキング両端キューです。 |
| LinkedBlockingQueue<E> | リンクノードに基づく、任意のバウンド形式のブロッキングキューです。 |
| PriorityBlockingQueue<E> | PriorityQueue クラスと同じ順序付けルールを使用し、ブロックする取得オペレーションを提供する、アンバウンド形式のブロッキングキューです。 |
| ScheduledThreadPoolExecutor | 指定された遅延時間後または定期的にコマンドを実行するように追加でスケジュールできる ThreadPoolExecutor です。 |
| Semaphore | 計数セマフォーです。 |
| SynchronousQueue<E> | 各挿入オペレーションが別のスレッドによる対応する削除オペレーションを待機する必要がある (およびその逆の) ブロッキングキュー です。 |
| ThreadPoolExecutor | プールされた複数のスレッドの 1 つを使用して送信された各タスクを実行する ExecutorService です。 |
| ThreadPoolExecutor.AbortPolicy | RejectedExecutionException をスローする拒否されたタスクのハンドラです。 |
| ThreadPoolExecutor.CallerRunsPolicy | executor がシャットダウンしていない場合に、execute メソッドの呼び出しで拒否されたタスクを直接実行する、拒否されたタスクのハンドラです。 |
| ThreadPoolExecutor.DiscardOldestPolicy | executor がシャットダウンしていない場合に、もっとも古い未処理の要求を破棄して execute を再試行する、拒否されたタスクのハンドラです。 |
| ThreadPoolExecutor.DiscardPolicy | 拒否されたタスクを通知なしで破棄する拒否されたタスクのハンドラです。 |
| 列挙型の概要 | |
|---|---|
| TimeUnit | TimeUnit は、指定された粒度単位で時間を表し、単位を変換したり、それらの単位でタイミングおよび遅延操作を実行したりするユーティリティーメソッドを提供します。 |
| 例外の概要 | |
|---|---|
| BrokenBarrierException | スレッドが故障状態にあるバリアーを待機しようとしているとき、または待機中にバリアーが故障状態になったときに、例外をスローします。 |
| CancellationException | FutureTask などの値を生成するタスクの結果を、そのタスクが取り消されたために取得できないことを示す例外です。 |
| ExecutionException | 例外をスローすることによって中断したタスクの結果を取得しようとしたときにスローされる例外です。 |
| RejectedExecutionException | タスクの実行を受け入れることができないときに Executor によってスローされる例外です。 |
| TimeoutException | ブロック操作がタイムアウトしたときにスローされる例外です。 |
並行プログラミングでよく使用されるユーティリティークラスです。このパッケージには、標準化された小規模な拡張可能フレームワークと、利用しなければ実装が面倒または困難である有用な機能を提供するクラスが含まれます。ここでは、主要なコンポーネントについて簡単に説明します。locks パッケージと atomic パッケージも参照してください。
Executor は、スレッドに似たカスタムサブシステム (スレッドプール、非同期入出力、軽量タスクフレームワークなど) を定義するための、標準化された単純なインタフェースです。使用している具象 executor クラスに応じて、タスクは新しく作成されたスレッド、既存のタスク実行スレッド、または execute() を呼び出すスレッドで、順次にまたは並行して実行されます。ExecutorService では、より完全な非同期タスク実行フレームワークが用意されています。ExecutorService は、タスクのキューイングとスケジュール設定を管理し、制御されたシャットダウンを可能にします。ScheduledExecutorService サブインタフェースおよび関連インタフェースでは、遅延されたまたは定期的なタスク実行のサポートが追加されています。ExecutorService には、Callable (Runnable に類似し、結果を生成) として表現される任意の関数の非同期実行を調整するメソッドが用意されています。Future は、関数の結果を返したり、実行が完了したかどうかの判断を可能にしたりするほか、実行を取り消す方法を提供します。RunnableFuture は、run メソッドを所有する Future で、実行時にその結果を設定します。
実装。 ThreadPoolExecutor クラスおよび ScheduledThreadPoolExecutor クラスは、調整可能で柔軟性の高いスレッドプールを提供します。Executors クラスには、もっとも一般的な executor の種類と設定のためのファクトリメソッドと、そのような executor を使用するためのユーティリティーメソッドがいくつかあります。executor を基にしたその他のユーティリティーには、Future の一般的な拡張可能実装である具象クラス FutureTask や、非同期タスクのグループ処理の調整を支援する ExecutorCompletionService などがあります。
ConcurrentLinkedQueue クラスは、効率的でスケーラブルなスレッドセーフの非ブロック FIFO キューを提供します。java.util.concurrent で拡張 BlockingQueue インタフェースをサポートする実装は LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue、および DelayQueue の 5 つがあり、このインタフェースは put と take のブロックバージョンを定義します。さまざまなクラスで、プロデューサ - コンシューマ、メッセージング、並列タスク実行、関連する並行設計などに対するもっとも一般的な使用コンテキストを網羅します。BlockingDeque インタフェースは BlockingQueue を拡張し、FIFO と LIFO (スタックベース) の両方のオペレーションをサポートします。LinkedBlockingDeque クラスでは実装を提供します。
TimeUnit クラスでは、タイムアウトベースのオペレーションの指定および制御に対して、複数の粒度 (ナノ秒単位まで) を提供します。パッケージのほとんどのクラスには、無期限に待機するオペレーションだけでなく、タイムアウトベースのオペレーションが含まれています。タイムアウトを使用するすべての場合で、タイムアウト値は、メソッドがタイムアウトしたことを示すまで待機する最小時間を指定します。タイムアウトの発生後できるだけ早くそれを検出するために、実装では「最善の努力」を払います。ただし、検出されたタイムアウトからそのタイムアウト後にスレッドが実際に再実行されるまでには、無期限に時間が経過することもあります。タイムアウトパラメータを受け入れるすべてのメソッドで、ゼロ以下の値をまったく待機しないものとして扱います。「永遠に」待機する場合は、値 Long.MAX_VALUE を使用できます。
Semaphore は、従来の並行処理ツールです。CountDownLatch は、非常に単純ですがよく使われるユーティリティーで、指定された数のシグナル、イベント、または条件を保持するまでブロックします。CyclicBarrier は、リセット可能な多用途の同期ポイントであり、一部の形式の並行プログラミングで有用です。Exchanger では、2 つのスレッドがランデブーポイントでオブジェクトを交換するようにできます。これは、いくつかのパイプライン設計で有用です。
ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList、および CopyOnWriteArraySet が提供されます。多くのスレッドが特定のコレクションにアクセスすることが想定される場合は、通常、同期された HashMap よりも ConcurrentHashMap、同期された TreeMap よりも ConcurrentSkipListMap を使用することをお勧めします。読み込みとトラバーサルの予想数がリストの更新数よりはるかに多い場合は、ArrayList よりも CopyOnWriteArrayList を使用することをお勧めします。
このパッケージの一部のクラスに使用される「Concurrent」接頭辞は、類似した「synchronized」クラスとは異なる点がいくつかあることを簡潔に表すためのものです。たとえば、java.util.Hashtable と Collections.synchronizedMap(new HashMap()) は同期されます。しかし、ConcurrentHashMap は、「並行」 (concurrent) です。並行処理コレクションはスレッドセーフですが、単一の排他ロックによる制御を受けません。ConcurrentHashMap の場合は、任意の数の並行読み込みと、調整可能な数の並行書き込みを安全に許可します。「synchronized」クラスは、コレクションへのすべてのアクセスを単一ロックで防ぐ必要がある場合に役立ちます。ただし、スケーラビリティーは低下します。一方、複数のスレッドが共通のコレクションにアクセスすることが予想される場合、通常は「concurrent」バージョンが適切です。コレクションが共有されていない場合、または別のロックを保持しているときにのみコレクションにアクセス可能である場合は、同期されていないコレクションを使うことをお勧めします。
また、ほとんどの並行処理 Collection 実装 (ほとんどの Queue を含む) は、Iterator がフェイルファストのトラバーサルではなく「弱一貫性」を提供する通常の java.util 規則とも異なります。弱一貫性反復子はスレッドセーフですが、繰り返し処理時にコレクションをフリーズする必要はないため、反復子の作成後の更新内容がすべて反映されることもあれば反映されないこともあります。
メモリー整合性特性
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 を呼び出す前のアクションは、バリアーアクションで実行されるアクションの「前に発生」し、バリアーアクションで実行されるアクションは、別のスレッド内の対応する await から正常に戻ったあとのアクションの「前に発生」します。
|
JavaTM Platform Standard Ed. 6 |
|||||||||
| 前のパッケージ 次のパッケージ | フレームあり フレームなし | |||||||||
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。