模块 java.base

类 AsynchronousChannelGroup

java.lang.Object
java.nio.channels.AsynchronousChannelGroup

public abstract class AsynchronousChannelGroup extends Object
以资源共享为目的的一组异步通道。

异步通道组封装了处理完成由绑定到该组的asynchronous channels 发起的 I/O 操作所需的机制。一个组有一个关联的线程池,任务被提交到该线程池以处理 I/O 事件并分派到 completion-handlers ,这些任务使用在该组中的通道上执行的异步操作的结果。除了处理 I/O 事件之外,池化线程还可以执行支持异步 I/O 操作执行所需的其他任务。

通过调用此处定义的 withFixedThreadPool withCachedThreadPool 方法创建异步通道组。通过在构建通道时指定组来将通道绑定到组。关联的线程池是组owned;组的终止导致关联线程池的关闭。

除了显式创建的组之外,Java 虚拟机还维护一个自动构建的系统范围的default group。构造时未指定组的异步通道绑定默认组。默认组有一个关联的线程池,可以根据需要创建新线程。默认组可以通过下表中定义的系统属性进行配置。如果未配置默认组的 ThreadFactory ,则默认组的池线程为 daemon 线程。

系统属性
系统属性 Description
java.nio.channels.DefaultThreadPool.threadFactory 此属性的值被视为具体 ThreadFactory 类的完全限定名称。该类使用系统类加载器加载并实例化。调用工厂的 newThread 方法为默认组的线程池创建每个线程。如果加载和实例化属性值的过程失败,则在构造默认组期间会抛出未指定的错误。
java.nio.channels.DefaultThreadPool.initialSize 默认组的 initialSize 参数值(参见 withCachedThreadPool )。该属性的值被视为初始大小参数 IntegerString 表示。如果该值无法解析为 Integer,则会导致在构造默认组期间抛出未指定的错误。

穿线

在绑定到组的通道上启动的 I/O 操作的完成处理程序保证由组中的池线程之一调用。这确保完成处理程序由具有预期 identity 的线程运行。

如果 I/O 操作立即完成,并且启动线程是组中的池线程之一,则启动线程可以直接调用完成处理程序。为避免堆栈溢出,实现可能会限制线程堆栈上的激活次数。某些 I/O 操作可能会禁止启动线程直接调用完成处理程序(请参阅 accept )。

关闭和终止

shutdown 方法用于启动组的 orderly shutdown。有序关闭将组标记为关闭;进一步尝试构建绑定到组的通道将抛出 ShutdownChannelGroupException 。可以使用 isShutdown 方法测试组是否关闭。一旦关闭,组 terminates 当绑定到该组的所有异步通道都关闭时,所有主动执行的完成处理程序都已运行完成,并且该组使用的资源被释放。不会尝试停止或中断正在执行完成处理程序的线程。 isTerminated 方法用于测试组是否终止,awaitTermination 方法可用于阻塞直到组终止。

shutdownNow 方法可用于启动组的 forceful shutdown。除了有序关闭执行的操作外,shutdownNow 方法还关闭组中所有打开的通道,就像调用 close 方法一样。

自从:
1.7
参见:
  • 构造方法详细信息

    • AsynchronousChannelGroup

      protected AsynchronousChannelGroup(AsynchronousChannelProvider  provider)
      初始化此类的新实例。
      参数:
      provider - 该组的异步通道提供者
  • 方法详情

    • provider

      public final AsynchronousChannelProvider  provider()
      返回创建此通道组的提供商。
      返回:
      创建此通道组的提供商
    • withFixedThreadPool

      public static AsynchronousChannelGroup  withFixedThreadPool(int nThreads, ThreadFactory  threadFactory) throws IOException
      创建具有固定线程池的异步通道组。

      生成的异步通道组重用固定数量的线程。在任何时候,最多 nThreads 个线程将是活动的处理任务,这些任务被提交以处理 I/O 事件并为在组中的异步通道上启动的操作分派完成结果。

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

      参数:
      nThreads - 池中的线程数
      threadFactory - 创建新线程时使用的工厂
      返回:
      一个新的异步通道组
      抛出:
      IllegalArgumentException - 如果 nThreads <= 0
      IOException - 如果发生 I/O 错误
    • withCachedThreadPool

      public static AsynchronousChannelGroup  withCachedThreadPool(ExecutorService  executor, int initialSize) throws IOException
      使用给定线程池创建一个异步通道组,该线程池根据需要创建新线程。

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

      initialSize 参数可由实现用作 hint 关于它可能提交的初始任务数。例如,它可用于指示等待 I/O 事件的线程的初始数量。

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

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

      参数:
      executor - 结果组的线程池
      initialSize - 值 >=0 或实现特定默认值的负值
      返回:
      一个新的异步通道组
      抛出:
      IOException - 如果发生 I/O 错误
      参见:
    • withThreadPool

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

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

      配置执行器服务时应小心。它应该支持 direct handoffunbounded queuing 提交的任务,并且调用 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 - 如果在等待时被打断