Module  java.base
软件包  java.nio.channels

Class AsynchronousChannelGroup



  • public abstract class AsynchronousChannelGroup
    extends Object
    用于资源共享的一组异步通道。

    异步通道组封装了处理由组合启动的asynchronous channels启动的I / O操作完成所需的机制。 一个组有一个相关联的线程池,任务被提交到其中来处理I / O事件, 并发送到completion-handlers ,消耗组中的通道执行异步操作的结果。 除了处理I / O事件之外,汇集的线程还可以执行支持执行异步I / O操作所需的其他任务。

    通过调用此处定义的withFixedThreadPoolwithCachedThreadPool方法创建异步通道组。 通道在构建通道时通过指定组来绑定到一个组。 相关联的线程池由组拥有 ; 组的终止导致关联线程池的关闭。

    除了明确创建的组之外,Java虚拟机还会维护自动构建的系统范围的默认组 在构建时不指定组的异步通道绑定到默认组。 默认组具有相关联的线程池,根据需要创建新线程。 默认组可以通过下表中定义的系统属性进行配置。 其中默认组的ThreadFactory未配置,则默认组的合并线程为daemon线程。

    System properties System property Description java.nio.channels.DefaultThreadPool.threadFactory The value of this property is taken to be the fully-qualified name of a concrete ThreadFactory class. The class is loaded using the system class loader and instantiated. The factory's newThread method is invoked to create each thread for the default group's thread pool. If the process to load and instantiate the value of the property fails then an unspecified error is thrown during the construction of the default group. java.nio.channels.DefaultThreadPool.initialSize The value of the initialSize parameter for the default group (see withCachedThreadPool). The value of the property is taken to be the String representation of an Integer that is the initial size parameter. If the value cannot be parsed as an Integer it causes an unspecified error to be thrown during the construction of the default group.

    穿线

    在绑定到组的通道上启动的I / O操作的完成处理程序将被保证由组中的一个合并线程调用。 这确保完成处理程序由具有预期标识的线程运行。

    在I / O操作立即完成的情况下,启动线程是组中的一个汇集线程,那么完成处理程序可能会被启动线程直接调用。 为了避免堆栈溢出,实现可能会对线程堆栈上的激活次数施加限制。 一些I / O操作可能会禁止启动线程直接调用完成处理程序(请参阅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​()
        返回创建此通道组的提供程序。
        结果
        创建此通道组的提供程序
      • withCachedThreadPool

        public static AsynchronousChannelGroup withCachedThreadPool​(ExecutorService executor,
                                                                    int initialSize)
                                                             throws IOException
        创建具有给定线程池的异步通道组,根据需要创建新线程。

        executor参数是一个ExecutorService ,根据需要创建新线程来执行提交处理I / O事件的任务,并为组中的异步通道启动的操作分派完成结果。 当它们可用时,它可以重用以前构造的线程。

        实施中可以使用initialSize参数作为其可能提交的初始任务数量的提示 例如,它可以用于指示等待I / O事件的初始线程数。

        执行器意图由所产生的异步通道组专门使用。 该组的终止导致了执行人服务的有序shutdown 以其他方式关闭执行者服务会导致未指定的行为。

        该组是通过调用系统范围默认的AsynchronousChannelProvider对象的openAsynchronousChannelGroup(ExecutorService,int)方法创建的。

        参数
        executor - 生成组的线程池
        initialSize - 值为 >=0或实现特定默认值的负值
        结果
        一个新的异步通道组
        异常
        IOException - 如果发生I / O错误
        另请参见:
        Executors.newCachedThreadPool()
      • withThreadPool

        public static AsynchronousChannelGroup withThreadPool​(ExecutorService executor)
                                                       throws IOException
        使用给定的线程池创建异步通道组。

        executor参数是一个ExecutorService ,它执行提交到ExecutorService完成结果的任务,用于在组中的异步通道上启动的操作。

        配置执行程序服务时应小心。 它应该支持直接切换或提交的任务的无限排队 ,并且调用execute方法的线程不应该直接调用该任务。 一个实施可能需要额外的限制。

        执行器意图由所产生的异步通道组专门使用。 该组的终止导致执行者服务的有序shutdown 以其他方式关闭执行者服务会导致未指定的行为。

        该组通过使用0的initialSize调用系统范围默认的AsynchronousChannelProvider对象的initialSize方法0

        参数
        executor - 生成组的线程池
        结果
        一个新的异步通道组
        异常
        IOException - 如果发生I / O错误
      • isShutdown

        public abstract boolean isShutdown​()
        告知这个异步通道组是否关闭。
        结果
        true如果此异步通道组已关闭或已标记为关闭。
      • isTerminated

        public abstract boolean isTerminated​()
        告诉本组是否已经终止。

        在此方法返回true ,相关线程池也有terminated

        结果
        true如果该组已经终止
      • shutdown

        public abstract void shutdown​()
        启动组的有序关闭。

        此方法将该组标记为关闭。 进一步尝试构建与此组绑定的通道将抛出ShutdownChannelGroupException 当组中的所有异步通道关闭时,组终止,所有主动执行的完成处理程序都已完成运行,并且所有资源都已被释放。 如果组已经关闭,则此方法无效。

      • shutdownNow

        public abstract void shutdownNow​()
                                  throws IOException
        关闭组并关闭组中的所有打开的通道。

        除了shutdown方法执行的操作之外 ,此方法也会在组中的所有打开的通道上调用close方法。 该方法不会阻止或中断正在执行完成处理程序的线程。 当所有主动执行的完成处理程序都运行到完成并且所有资源已经被释放时,该组终止。 可以随时调用此方法。 如果一些其他线程已经调用它,那么另一个调用将阻塞,直到第一次调用完成,之后它将不起作用。

        异常
        IOException - 如果发生I / O错误
      • awaitTermination

        public abstract boolean awaitTermination​(long timeout,
                                                 TimeUnit unit)
                                          throws InterruptedException
        等待该组终止。

        该方法阻塞,直到组终止,或超时发生,或当前线程中断,以先发生者为准。

        参数
        timeout - 等待的最长时间,或零或更少等待不等待
        unit - 超时参数的时间单位
        结果
        true如果该组已经终止; false如果在终止前超时
        异常
        InterruptedException - 如果在等待时中断