异步通道组封装了处理绑定到组的异步通道发起的I/O操作完成所需的机制。组有一个关联的线程池,任务被提交到该线程池以处理I/O事件并分派给消费通道组中通道上执行的异步操作结果的完成处理程序。除了处理I/O事件外,池化线程还可以执行其他任务,以支持异步I/O操作的执行。
通过调用此处定义的withFixedThreadPool
或withCachedThreadPool
方法来创建一个异步通道组。通过在构造通道时指定组来将通道绑定到组。关联的线程池由组“拥有”;组的终止导致关联的线程池关闭。
除了显式创建的组外,Java虚拟机还维护一个系统范围的“默认组”,该组会自动构建。在构造时未指定组的异步通道将绑定到默认组。默认组有一个关联的线程池,根据需要创建新线程。默认组可以通过下表中定义的系统属性进行配置。如果未配置默认组的ThreadFactory
,则默认组的池化线程是守护线程。
系统属性 | 描述 |
---|---|
java.nio.channels.DefaultThreadPool.threadFactory |
此属性的值被视为具体ThreadFactory 类的完全限定名称。使用系统类加载器加载该类并实例化。工厂的newThread 方法被调用以为默认组的线程池创建每个线程。如果加载和实例化属性值的过程失败,则在构造默认组时会抛出未指定的错误。 |
java.nio.channels.DefaultThreadPool.initialSize |
默认组的initialSize 参数的值(参见withCachedThreadPool )。属性的值被视为Integer 的String 表示形式,即初始大小参数。如果该值无法解析为Integer ,则在构造默认组时会引发未指定的错误。 |
线程
对于绑定到组的通道上发起的I/O操作的完成处理程序保证由组中的池化线程之一调用。这确保完成处理程序由具有预期“身份”的线程运行。
当I/O操作立即完成,并且发起线程是组中的池化线程之一时,完成处理程序可能会直接由发起线程调用。为避免堆栈溢出,实现可能会对线程堆栈上的激活次数施加限制。某些I/O操作可能禁止由发起线程直接调用完成处理程序(请参见accept
)。
- 自版本:
- 1.7
- 参见:
-
Constructor Summary
ModifierConstructorDescriptionprotected
初始化此类的新实例。 -
Method Summary
Modifier and TypeMethodDescriptionabstract 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) 使用给定线程池创建异步通道组。
-
Constructor Details
-
AsynchronousChannelGroup
初始化此类的新实例。- 参数:
-
provider
- 该组的异步通道提供程序
-
-
Method Details
-
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
参数可能被实现用作关于可能提交的初始任务数量的“提示”。例如,它可以用于指示等待I/O事件的初始线程数。执行程序仅供结果的异步通道组使用。组的终止导致执行程序服务的有序关闭。通过其他方式关闭执行程序服务会导致未指定的行为。
通过调用系统范围的默认
AsynchronousChannelProvider
对象的openAsynchronousChannelGroup(ExecutorService,int)
方法来创建该组。- 参数:
-
executor
- 用于结果组的线程池 -
initialSize
->=0
的值或实现特定默认值的负值 - 返回:
- 新的异步通道组
- 抛出:
-
IOException
- 如果发生I/O错误 - 参见:
-
withThreadPool
创建具有给定线程池的异步通道组。executor
参数是一个ExecutorService
,用于执行提交的任务,以便为组中启动的异步通道的操作分派完成结果。配置执行器服务时应谨慎。它应支持提交任务的直接移交或无界排队,调用
execute
方法的线程不应直接调用任务。实现可能会强制额外的约束。执行器应仅由生成的异步通道组专用。组的终止会导致执行器服务的有序
关闭
。以其他方式关闭执行器服务会导致未指定的行为。通过使用系统范围内默认的
AsynchronousChannelProvider
对象的openAsynchronousChannelGroup(ExecutorService,int)
方法创建组,其中initialSize
为0
。- 参数:
-
executor
- 生成组的线程池 - 返回:
- 一个新的异步通道组
- 抛出:
-
IOException
- 如果发生I/O错误
-
isShutdown
public abstract boolean isShutdown()告知此异步通道组是否已关闭。- 返回:
-
如果此异步通道组已关闭或已标记为关闭,则返回
true
。
-
isTerminated
public abstract boolean isTerminated()告知此组是否已终止。当此方法返回
true
时,相关的线程池也已经终止
。- 返回:
-
如果此组已终止,则返回
true
。
-
shutdown
public abstract void shutdown()启动组的有序关闭。此方法将组标记为已关闭。进一步尝试构造绑定到此组的通道将引发
ShutdownChannelGroupException
。当组中的所有异步通道都关闭,所有正在执行的完成处理程序都已完成运行,并且所有资源都已释放时,组将终止。如果组已经关闭,则此方法不起作用。 -
shutdownNow
关闭组并关闭组中的所有打开通道。除了
关闭
方法执行的操作外,此方法还会在组中的所有打开通道上调用close
方法。此方法不会尝试停止或中断正在执行完成处理程序的线程。组将在所有正在执行的完成处理程序都已完成运行并且所有资源都已释放时终止。此方法可以随时调用。如果其他线程已经调用了它,则另一个调用将阻塞,直到第一个调用完成,然后返回而不产生影响。- 抛出:
-
IOException
- 如果发生I/O错误
-
awaitTermination
等待组终止。此方法将阻塞,直到组终止,或超时发生,或当前线程被中断,以先发生者为准。
- 参数:
-
timeout
- 等待的最长时间,如果为零或更短则不等待 -
unit
- 超时参数的时间单位 - 返回:
-
如果组已终止,则返回
true
;如果超时发生在终止之前,则返回false
。 - 抛出:
-
InterruptedException
- 在等待时被中断
-