模块  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方法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 ,它执行提交的任务,以便为在组中的异步通道上启动的操作分派完成结果。

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

        执行程序仅由生成的异步通道组使用。 终止该组导致执行程序服务的有序shutdown 通过其他方式关闭执行程序服务会导致未指定的行为。

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

        参数
        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 - 如果在等待时中断