JavaTM Platform
Standard Ed. 6

パッケージ java.util.concurrent

並行プログラミングでよく使用されるユーティリティークラスです。

参照先:
          説明

インタフェースの概要
BlockingDeque<E> 要素の取得時に両端キューが空でなくなるまで待機したり、要素の格納時に両端キュー内に空きが生じるまで待機するブロック操作を追加でサポートしたりする Deque です。
BlockingQueue<E> 要素の取得時にキューが空でなくなるまで待機したり、要素の格納時にキュー内に空きが生じるまで待機する操作を追加でサポートする Queue です。
Callable<V> 結果を返し、例外をスローすることがあるタスクです。
CompletionService<V> 新しい非同期タスクの生成を、完了済みタスクの結果の消費から分離するサービスです。
ConcurrentMap<K,V> 追加の原子的 putIfAbsentremove、および 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> 基になる配列の新しいコピーを作成することにより、すべての推移的操作 (addset など) が実装される ArrayList のスレッドセーフな変数です。
CopyOnWriteArraySet<E> すべての操作で内部 CopyOnWriteArrayList を使用する Set
CountDownLatch 他のスレッドで実行中の操作セットが完了するまで、1 つ以上のスレッドを待機可能にする同期化支援機能です。
CyclicBarrier スレッドセットのそれぞれが共通のバリアーポイントに達するまで待機することを可能にする同期化支援機能です。
DelayQueue<E extends Delayed> Delayed 要素のアンバウンド形式のブロッキングキューで、遅延時間が経過後にのみ、要素を取得できます。
Exchanger<V> スレッドをペアにして、ペア内の要素を交換できる同期ポイント。
ExecutorCompletionService<V> タスクの実行に、指定された Executors を使用する CompletionService です。
Executors このパッケージで定義された ExecutorExecutorServiceScheduledExecutorServiceThreadFactory、および 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 ブロック操作がタイムアウトしたときにスローされる例外です。
 

パッケージ java.util.concurrent の説明

並行プログラミングでよく使用されるユーティリティークラスです。このパッケージには、標準化された小規模な拡張可能フレームワークと、利用しなければ実装が面倒または困難である有用な機能を提供するクラスが含まれます。ここでは、主要なコンポーネントについて簡単に説明します。locks パッケージと atomic パッケージも参照してください。

executor

インタフェース。 Executor は、スレッドに似たカスタムサブシステム (スレッドプール、非同期入出力、軽量タスクフレームワークなど) を定義するための、標準化された単純なインタフェースです。使用している具象 executor クラスに応じて、タスクは新しく作成されたスレッド、既存のタスク実行スレッド、または execute() を呼び出すスレッドで、順次にまたは並行して実行されます。ExecutorService では、より完全な非同期タスク実行フレームワークが用意されています。ExecutorService は、タスクのキューイングとスケジュール設定を管理し、制御されたシャットダウンを可能にします。ScheduledExecutorService サブインタフェースおよび関連インタフェースでは、遅延されたまたは定期的なタスク実行のサポートが追加されています。ExecutorService には、Callable (Runnable に類似し、結果を生成) として表現される任意の関数の非同期実行を調整するメソッドが用意されています。Future は、関数の結果を返したり、実行が完了したかどうかの判断を可能にしたりするほか、実行を取り消す方法を提供します。RunnableFuture は、run メソッドを所有する Future で、実行時にその結果を設定します。

実装。 ThreadPoolExecutor クラスおよび ScheduledThreadPoolExecutor クラスは、調整可能で柔軟性の高いスレッドプールを提供します。Executors クラスには、もっとも一般的な executor の種類と設定のためのファクトリメソッドと、そのような executor を使用するためのユーティリティーメソッドがいくつかあります。executor を基にしたその他のユーティリティーには、Future の一般的な拡張可能実装である具象クラス FutureTask や、非同期タスクのグループ処理の調整を支援する ExecutorCompletionService などがあります。

キュー

java.util.concurrent ConcurrentLinkedQueue クラスは、効率的でスケーラブルなスレッドセーフの非ブロック FIFO キューを提供します。java.util.concurrent で拡張 BlockingQueue インタフェースをサポートする実装は LinkedBlockingQueueArrayBlockingQueueSynchronousQueuePriorityBlockingQueue、および DelayQueue の 5 つがあり、このインタフェースは put と take のブロックバージョンを定義します。さまざまなクラスで、プロデューサ - コンシューマ、メッセージング、並列タスク実行、関連する並行設計などに対するもっとも一般的な使用コンテキストを網羅します。BlockingDeque インタフェースは BlockingQueue を拡張し、FIFO と LIFO (スタックベース) の両方のオペレーションをサポートします。LinkedBlockingDeque クラスでは実装を提供します。

タイミング

TimeUnit クラスでは、タイムアウトベースのオペレーションの指定および制御に対して、複数の粒度 (ナノ秒単位まで) を提供します。パッケージのほとんどのクラスには、無期限に待機するオペレーションだけでなく、タイムアウトベースのオペレーションが含まれています。タイムアウトを使用するすべての場合で、タイムアウト値は、メソッドがタイムアウトしたことを示すまで待機する最小時間を指定します。タイムアウトの発生後できるだけ早くそれを検出するために、実装では「最善の努力」を払います。ただし、検出されたタイムアウトからそのタイムアウト後にスレッドが実際に再実行されるまでには、無期限に時間が経過することもあります。タイムアウトパラメータを受け入れるすべてのメソッドで、ゼロ以下の値をまったく待機しないものとして扱います。「永遠に」待機する場合は、値 Long.MAX_VALUE を使用できます。

シンクロナイザ

よく利用される特化された同期方法を支援するために 4 つのクラスがあります。Semaphore は、従来の並行処理ツールです。CountDownLatch は、非常に単純ですがよく使われるユーティリティーで、指定された数のシグナル、イベント、または条件を保持するまでブロックします。CyclicBarrier は、リセット可能な多用途の同期ポイントであり、一部の形式の並行プログラミングで有用です。Exchanger では、2 つのスレッドがランデブーポイントでオブジェクトを交換するようにできます。これは、いくつかのパイプライン設計で有用です。

並行処理コレクション

このパッケージでは、Queue のほかにも、マルチスレッドコンテキストで使用するために設計された Collection 実装である ConcurrentHashMapConcurrentSkipListMapConcurrentSkipListSetCopyOnWriteArrayList、および CopyOnWriteArraySet が提供されます。多くのスレッドが特定のコレクションにアクセスすることが想定される場合は、通常、同期された HashMap よりも ConcurrentHashMap、同期された TreeMap よりも ConcurrentSkipListMap を使用することをお勧めします。読み込みとトラバーサルの予想数がリストの更新数よりはるかに多い場合は、ArrayList よりも CopyOnWriteArrayList を使用することをお勧めします。

このパッケージの一部のクラスに使用される「Concurrent」接頭辞は、類似した「synchronized」クラスとは異なる点がいくつかあることを簡潔に表すためのものです。たとえば、java.util.HashtableCollections.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 関係を形成することができます。特に次の点が重要です。 java.util.concurrent およびそのサブパッケージ内にあるすべてのクラスのメソッドは、これらの保証をより高レベルの同期にまで拡張します。特に次の点が重要です。

導入されたバージョン:
1.5

JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。