モジュール java.base
パッケージ java.nio.channels

クラスAsynchronousChannelGroup



  • public abstract class AsynchronousChannelGroup
    extends Object
    リソースを共有するための非同期チャネルのグループ化。

    非同期チャネル・グループは、グループにバインドされたasynchronous channelsによって開始された入出力操作の完了を処理するために必要な機構をカプセル化します。 グループには、グループ内のチャネルで実行される非同期操作の結果を消費する入出力イベントを処理して、completion-handlersにディスパッチするための、タスクの送信先に関連するスレッド・プールがあります。 プールされたスレッドは、入出力イベントの処理に加えて、非同期入出力操作の実行をサポートするために必要なその他のタスクを実行することもあります。

    非同期チャネル・グループは、ここで定義されたwithFixedThreadPoolメソッドまたはwithCachedThreadPoolメソッドを呼び出すことで作成されます。 チャネルは、チャネルの構築時にグループを指定することでグループにバインドされます。 関連するスレッド・プールは、グループによって所有されます。グループを終了すると、関連するスレッド・プールがシャットダウンされます。

    Java仮想マシンは、明示的に作成されたグループのほかに、自動的に構築されるシステム全体のデフォルト・グループを維持します。 構築時にグループを指定しない非同期チャネルは、デフォルト・グループにバインドされます。 デフォルト・グループには、必要に応じて新しいスレッドを作成する、関連するスレッド・プールがあります。 デフォルト・グループは、次の表で定義されているシステム・プロパティを使用して構成されることがあります。 デフォルト・グループのThreadFactoryが構成されない場合、デフォルト・グループのプールされたスレッドはdaemonスレッドです。

    システム・プロパティ
    システム・プロパティ 説明
    java.nio.channels.DefaultThreadPool.threadFactory このプロパティの値は、具象ThreadFactoryクラスの完全修飾名になります。 クラスは、システム・クラス・ローダーを使用してロードされ、インスタンス化されます。 デフォルト・グループのスレッド・プールの各スレッドを作成するために、ファクトリのnewThreadメソッドが呼び出されます。 プロパティの値をロードしてインスタンス化するためのプロセスが失敗した場合、デフォルト・グループの構築中に未指定のエラーがスローされます。
    java.nio.channels.DefaultThreadPool.initialSize デフォルト・グループのinitialSizeパラメータの値(withCachedThreadPoolを参照)。 プロパティの値は、初期サイズ・パラメータであるIntegerString表現になります。 値をIntegerとして解析できない場合、デフォルト・グループの構築中に未指定のエラーがスローされます。

    スレッド

    グループにバインドされたチャネルで開始された入出力操作の終了ハンドラは、グループ内のプールされたスレッドの1つによって呼び出されることが保証されます。 これによって、終了ハンドラは必ず、予期されるIDを持つスレッドによって実行されます。

    入出力操作がただちに終了し、開始スレッドがグループ内のプールされたスレッドの1つである場合、終了ハンドラは開始スレッドによって直接呼び出されることがあります。 スタック・オーバーフローを回避するために、実装によっては、スレッド・スタックでの起動の数に関する制限が適用される場合があります。 一部の入出力操作では、開始スレッドによって終了ハンドラを直接呼び出すことは禁止されていることがあります(acceptを参照)。

    シャットダウンおよび終了

    shutdownメソッドは、グループの正しい順序でのシャットダウンを開始するために使用されます。 正しい順序でのシャットダウンによって、グループはシャットダウンとしてマークされ、グループにバインドするチャネルをさらに構築しようとすると、ShutdownChannelGroupExceptionがスローされます。 グループがシャットダウンされるかどうかは、isShutdownメソッドを使用してテストできます。 シャットダウン後に、グループにバインドされたすべての非同期チャネルがクローズされ、アクティブに実行中のすべての終了ハンドラの実行が終了し、グループによって使用されていたリソースが解放されると、グループは終了します 実行ハンドラを実行しているスレッドの停止または割込みは試行されません。 グループが終了したかどうかをテストするためにisTerminatedメソッドが使用され、awaitTerminationメソッドを使用して、グループが終了するまでブロックすることができます。

    shutdownNowメソッドを使用して、グループの強制的なシャットダウンを開始することができます。 shutdownNowメソッドは、正しい順序でのシャットダウンによって実行されるアクションのほかに、closeメソッドを呼び出す場合と同じようにグループ内の開いているチャネルをすべて閉じます。

    導入されたバージョン:
    1.7
    関連項目:
    AsynchronousSocketChannel.open(AsynchronousChannelGroup), AsynchronousServerSocketChannel.open(AsynchronousChannelGroup)
    • コンストラクタの詳細

      • 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サービスをシャットダウンした場合の動作は保証されていません。

        initialSize0のシステム全体のデフォルト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 - 待機中に割込みが発生した場合