Java™ Platform
Standard Edition 7

パッケージ java.util.concurrent

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

参照: 説明

パッケージ 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 キューを提供します。

java.util.concurrent 内の 5 つの実装、つまり LinkedBlockingQueueArrayBlockingQueueSynchronousQueuePriorityBlockingQueue、および DelayQueue は、put と take のブロックバージョンを定義する拡張された BlockingQueue インタフェースをサポートします。さまざまなクラスで、プロデューサ - コンシューマ、メッセージング、並列タスク実行、関連する並行設計などに対するもっとも一般的な使用コンテキストを網羅します。

拡張された TransferQueue インタフェース、および LinkedTransferQueue 実装では、プロデューサが必要に応じてそのコンシューマの待機をブロックできる、同期 transfer メソッド (および関連する機能) が導入されます。

BlockingDeque インタフェースは BlockingQueue を拡張して、FIFO と LIFO (スタックベース) の両方のオペレーションをサポートします。LinkedBlockingDeque クラスは、実装を提供します。

タイミング

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

シンクロナイザ

よく利用される特化された同期方法を支援するために 5 つのクラスがあります。

並行処理コレクション

このパッケージでは、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
Java™ Platform
Standard Edition 7

バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.