非同期チャネル・グループは、グループにバインドされたasynchronous channels
によって開始された入出力操作の完了を処理するために必要な機構をカプセル化します。 グループには、グループ内のチャネルで実行される非同期操作の結果を消費する入出力イベントを処理して、completion-handlers
にディスパッチするための、タスクの送信先に関連するスレッド・プールがあります。 プールされたスレッドは、入出力イベントの処理に加えて、非同期入出力操作の実行をサポートするために必要なその他のタスクを実行することもあります。
非同期チャネル・グループは、ここで定義されたwithFixedThreadPool
メソッドまたはwithCachedThreadPool
メソッドを呼び出すことで作成されます。 チャネルは、チャネルの構築時にグループを指定することでグループにバインドされます。 関連するスレッド・プールは、グループによって所有されます。グループを終了すると、関連するスレッド・プールがシャットダウンされます。
Java仮想マシンは、明示的に作成されたグループのほかに、自動的に構築されるシステム全体のデフォルト・グループを維持します。 構築時にグループを指定しない非同期チャネルは、デフォルト・グループにバインドされます。 デフォルト・グループには、必要に応じて新しいスレッドを作成する、関連するスレッド・プールがあります。 デフォルト・グループは、次の表で定義されているシステム・プロパティを使用して構成されることがあります。 デフォルト・グループのThreadFactory
が構成されない場合、デフォルト・グループのプールされたスレッドはdaemon
スレッドです。
システム・プロパティ | 説明 |
---|---|
java.nio.channels.DefaultThreadPool.threadFactory
|
このプロパティの値は、具象ThreadFactory クラスの完全修飾名になります。 クラスは、システム・クラス・ローダーを使用してロードされ、インスタンス化されます。 デフォルト・グループのスレッド・プールの各スレッドを作成するために、ファクトリのnewThread メソッドが呼び出されます。 プロパティの値をロードしてインスタンス化するためのプロセスが失敗した場合、デフォルト・グループの構築中に未指定のエラーがスローされます。 |
java.nio.channels.DefaultThreadPool.initialSize
|
デフォルト・グループのinitialSize パラメータの値(withCachedThreadPool を参照)。 プロパティの値は、初期サイズ・パラメータであるInteger のString 表現になります。 値をInteger として解析できない場合、デフォルト・グループの構築中に未指定のエラーがスローされます。 |
スレッド
グループにバインドされたチャネルで開始された入出力操作の終了ハンドラは、グループ内のプールされたスレッドの1つによって呼び出されることが保証されます。 これによって、終了ハンドラは必ず、予期されるIDを持つスレッドによって実行されます。
入出力操作がただちに終了し、開始スレッドがグループ内のプールされたスレッドの1つである場合、終了ハンドラは開始スレッドによって直接呼び出されることがあります。 スタック・オーバーフローを回避するために、実装によっては、スレッド・スタックでの起動の数に関する制限が適用される場合があります。 一部の入出力操作では、開始スレッドによって終了ハンドラを直接呼び出すことは禁止されていることがあります(accept
を参照)。
シャットダウンおよび終了
shutdown
メソッドは、グループの正しい順序でのシャットダウンを開始するために使用されます。 正しい順序でのシャットダウンによって、グループはシャットダウンとしてマークされ、グループにバインドするチャネルをさらに構築しようとすると、ShutdownChannelGroupException
がスローされます。 グループがシャットダウンされるかどうかは、isShutdown
メソッドを使用してテストできます。 シャットダウン後に、グループにバインドされたすべての非同期チャネルがクローズされ、アクティブに実行中のすべての終了ハンドラの実行が終了し、グループによって使用されていたリソースが解放されると、グループは終了します。 実行ハンドラを実行しているスレッドの停止または割込みは試行されません。 グループが終了したかどうかをテストするためにisTerminated
メソッドが使用され、awaitTermination
メソッドを使用して、グループが終了するまでブロックすることができます。
shutdownNow
メソッドを使用して、グループの強制的なシャットダウンを開始することができます。 shutdownNow
メソッドは、正しい順序でのシャットダウンによって実行されるアクションのほかに、close
メソッドを呼び出す場合と同じようにグループ内の開いているチャネルをすべて閉じます。
-
コンストラクタのサマリー
修飾子コンストラクタ説明protected
このクラスの新しいインスタンスを初期化します。 -
メソッドのサマリー
修飾子と型メソッド説明abstract boolean
awaitTermination(long timeout, TimeUnit unit)
グループの終了を待機します。abstract boolean
この非同期チャネル・グループがシャットダウンされているかどうかを判断します。abstract boolean
このグループが終了したかどうかを判断します。provider()
このチャネル・グループの作成元プロバイダを返します。abstract void
shutdown()
正しい順序でグループのシャットダウンを開始します。abstract void
グループをシャットダウンし、グループ内のすべての開いているチャネルを閉じます。static AsynchronousChannelGroup
withCachedThreadPool(ExecutorService executor, int initialSize)
必要に応じて新しいスレッドを作成する指定されたスレッド・プールで、非同期チャネル・グループを作成します。static AsynchronousChannelGroup
withFixedThreadPool(int nThreads, ThreadFactory threadFactory)
固定されたスレッド・プールで非同期チャネル・グループを作成します。static AsynchronousChannelGroup
withThreadPool(ExecutorService executor)
指定されたスレッド・プールで非同期チャネル・グループを作成します。
-
コンストラクタの詳細
-
AsynchronousChannelGroup
protected AsynchronousChannelGroup(AsynchronousChannelProvider provider)このクラスの新しいインスタンスを初期化します。- パラメータ:
provider
- このグループの非同期チャネル・プロバイダ
-
-
メソッドの詳細
-
provider
public final AsynchronousChannelProvider provider()このチャネル・グループの作成元プロバイダを返します。- 戻り値:
- このチャネル・グループの作成元プロバイダ
-
withFixedThreadPool
public static AsynchronousChannelGroup withFixedThreadPool(int nThreads, ThreadFactory threadFactory) throws IOException固定されたスレッド・プールで非同期チャネル・グループを作成します。結果の非同期チャネル・グループは、固定数のスレッドを再利用します。 任意のポイントで、最大
nThreads
のスレッドが、入出力イベントを処理して、グループ内の非同期チャネルで開始された操作の終了結果をディスパッチするために送信されるアクティブな処理タスクになります。システム全体のデフォルト
AsynchronousChannelProvider
オブジェクトのopenAsynchronousChannelGroup(int,ThreadFactory)
メソッドを呼び出すことで、グループが作成されます。- パラメータ:
nThreads
- プール内のスレッド数threadFactory
- 新規スレッドの作成時に使用するファクトリ- 戻り値:
- 新しい非同期チャネル・グループ
- 例外:
IllegalArgumentException
-nThreads <= 0
の場合:IOException
- 入出力エラーが発生した場合
-
withCachedThreadPool
public static AsynchronousChannelGroup withCachedThreadPool(ExecutorService executor, int initialSize) throws IOException必要に応じて新しいスレッドを作成する指定されたスレッド・プールで、非同期チャネル・グループを作成します。executor
パラメータは、入出力イベントを処理して、グループ内の非同期チャネルで開始された操作の終了結果をディスパッチする目的で送信されるタスクを実行するために、必要に応じて新しいスレッドを作成するExecutorService
です。 これは、以前に構築されたスレッドが使用可能な場合はそのスレッドを再利用することがあります。initialSize
パラメータは、送信できるタスクの初期の数に関するヒントとして実装によって使用されることがあります。 たとえば、これは、入出力イベントで待機するスレッドの初期の数を示すために使用できます。executorは、結果の非同期チャネル・グループのみに使用されることを想定しています。 グループを終了すると、executorサービスの正しい順序での
shutdown
が実行されます。 ほかの手段でexecutorサービスをシャットダウンした場合の動作は保証されていません。システム全体のデフォルト
AsynchronousChannelProvider
オブジェクトのopenAsynchronousChannelGroup(ExecutorService,int)
メソッドを呼び出すことで、グループが作成されます。- パラメータ:
executor
- 結果のグループのためのスレッド・プールinitialSize
->=0
の値、実装固有のデフォルトの場合は負の値- 戻り値:
- 新しい非同期チャネル・グループ
- 例外:
IOException
- 入出力エラーが発生した場合- 関連項目:
Executors.newCachedThreadPool()
-
withThreadPool
public static AsynchronousChannelGroup withThreadPool(ExecutorService executor) throws IOException指定されたスレッド・プールで非同期チャネル・グループを作成します。executor
パラメータは、グループ内の非同期チャネルで開始された操作の終了結果をディスパッチするために送信されるタスクを実行するExecutorService
です。executorサービスの構成時には注意してください。 これは、送信されたタスクの直接ハンドオフまたはアンバウンド形式のキューをサポートするはずであり、
execute
メソッドを呼び出すスレッドがタスクを直接呼び出すことはありません。 実装には追加の制約が必要な場合があります。executorは、結果の非同期チャネル・グループのみに使用されることを想定しています。 グループを終了すると、executorサービスの正しい順序での
shutdown
が実行されます。 ほかの手段でexecutorサービスをシャットダウンした場合の動作は保証されていません。initialSize
が0
のシステム全体のデフォルトAsynchronousChannelProvider
オブジェクトのopenAsynchronousChannelGroup(ExecutorService,int)
メソッドを呼び出すことで、グループが作成されます。- パラメータ:
executor
- 結果のグループのためのスレッド・プール- 戻り値:
- 新しい非同期チャネル・グループ
- 例外:
IOException
- 入出力エラーが発生した場合
-
isShutdown
public abstract boolean isShutdown()この非同期チャネル・グループがシャットダウンされているかどうかを判断します。- 戻り値:
- この非同期チャネル・グループがシャットダウンされるか、シャットダウン用にマークされている場合は
true
。
-
isTerminated
public abstract boolean isTerminated()このグループが終了したかどうかを判断します。このメソッドが
true
を返す場合、関連するスレッド・プールも終了
されます。- 戻り値:
- このグループが終了した場合は
true
。
-
shutdown
public abstract void shutdown()正しい順序でグループのシャットダウンを開始します。このメソッドがグループにシャットダウンのマークを付けます。 このグループにバインドするチャネルをさらに構築しようとすると、
ShutdownChannelGroupException
がスローされます。 グループ内のすべての非同期チャネルがクローズされ、アクティブに実行中のすべての終了ハンドラの実行が終了し、すべてのリソースが解放されると、グループは終了します。 グループがすでにシャットダウンしている場合、このメソッドは何の影響も与えません。 -
shutdownNow
public abstract void shutdownNow() throws IOExceptionグループをシャットダウンし、グループ内のすべての開いているチャネルを閉じます。shutdown
メソッドによって実行されるアクションに加えて、このメソッドは、グループ内で開いているすべてのチャネルでclose
メソッドを呼び出します。 このメソッドは、実行ハンドラを実行しているスレッドの停止または割込みを試行しません。 アクティブに実行中の終了ハンドラの実行が終了し、すべてのリソースが解放されると、グループは終了します。 このメソッドはいつでも呼び出すことができます。 ほかの何らかのスレッドがこのメソッドをすでに呼び出している場合、別の呼出しは最初の呼出しが完了するまでブロックされ、そのあと何も効果を発揮することなく戻ります。- 例外:
IOException
- 入出力エラーが発生した場合
-
awaitTermination
public abstract boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedExceptionグループの終了を待機します。このメソッドは、グループが終了するか、タイム・アウトが発生するか、現在のスレッドが割り込まれるか、そのいずれかが最初に発生するまでブロックされます。
- パラメータ:
timeout
- 待機する最長時間。待機しない場合はゼロ以下の値unit
- timeout引数の時間単位- 戻り値:
- グループが終了した場合は
true
、終了前にタイム・アウトが経過した場合はfalse
- 例外:
InterruptedException
- 待機中に割込みが発生した場合
-