异步 Channel

AsynchronousChannel

public interface AsynchronousChannel
extends Channel

1、支持异步 I/O 操作的通道

2、异步 I/O 操作通常采用以下两种形式之一

(1)Future<V> operation(...) 

(2)void operation(... A attachment, CompletionHandler<V,? super A> handler) 

(3)其中 operation 是 I/O 操作的名称(例如读或写), V 是 I/O 操作的结果类型,A 是附加到 I/O 操作以提供上下文的对象的类型消耗结果,对于无状态 CompletionHandler 用于消耗许多 I/O 操作的结果的情况,CompletionHandler 很重要

(4)在第一种形式中,由 Future 接口定义的方法,可用于检查操作是否已经完成,等待其完成,并检索结果

(5)在第二种形式中,一个 CompletionHandler 被调用它何时完成或失败来消耗 I/O 操作的结果

3、实现这个接口的通道是可以异步关闭的,如果通道上的 I/O 操作未完成,而通道的关闭方法被调用,那么 I/O 操作就会失败,出现 AsynchronousCloseException 异常

4、异步通道可以安全地被多个并发线程使用,一些通道实现可以支持并发读取和写入,但可能不允许在任何时候有超过一个读和一个写的操作

5、消除

(1)Future 接口定义取消执行的 cancel 方法,这将导致所有线程等待 I/O 操作的结果抛出 CancellationException,是否可以取消底层 I / O操作是高度实现具体的,因此未指定

(2)如果取消操作使通道或与之相连的实体处于不一致的状态,那么通道就会进入一个特定于实现的错误状态,防止进一步尝试启动与被取消的操作相似的 I/O 操作,例如,如果一个读操作被取消,但实现不能保证字节没有被从通道中读取,那么它就把通道放入一个错误状态;进一步尝试启动一个 read 操作会导致一个未指定的运行时异常被抛出;同样地,如果一个写操作被取消了,但实现不能保证字节没有被写入通道,那么随后试图启动一个 write 操作将失败,并产生一个未指定的运行时异常

(3)在 cancel 方法调用 mayInterruptIfRunning 参数设置为 true 下,I/O 操作可能会由于关闭通道而中断,在这种情况下,等待 I/O 操作结果的所有线程都抛出 CancellationException,任何其他在通道上未完成的 I/O 操作都出现  AsynchronousCloseException

(4)在调用 cancel 方法以取消读取或写入操作的情况下,建议丢弃在 I/O 操作中使用的所有缓冲区,或注意确保在通道保持打开状态时不访问缓冲区

 

AsynchronousByteChannel

public interface AsynchronousByteChannel
extends AsynchronousChannel

1、一个可以读写字节的异步通道

2、某些通道在任何给定的时间,可能不允许多于一个读或写

(1)如果线程在先前的读取操作完成之前调用读取方法,那么将抛出一个 ReadPendingException

(2)如果在先前写入完成之前调用了写入方法,则抛出 WritePendingException

(3)其他类型的 I / O 操作,是否可以与读取操作同时进行,取决于通道的类型

3、请注意, ByteBuffer 对于多个并发线程不能使用,当启动读或写操作时,必须注意确保在操作完成之前不访问缓冲区

 

AsynchronousChannelGroup

public abstract class AsynchronousChannelGroup
extends Object

1、用于资源共享的一组异步通道

2、异步通道组封装了处理绑定到组的 asynchronous channels 发起的 I / O 操作完成所需的机制

(1)一个组具有相关联的线程池,任务被提交到该处理 I / O 事件并发送到 completion-handlers,消耗在组中的通道上执行的异步操作的结果

(2)除了处理 I / O 事件之外,汇集的线程还可以执行支持执行异步 I / O 操作所需的其他任务

3、通过调用这里定义的 withFixedThreadPool 或 withCachedThreadPool 方法创建异步通道组

(1)通道在构建通道时通过指定组来绑定到一个组

(2)相关联的线程池由组拥有

(3)组的终止导致关联线程池的关闭

4、除了明确创建的组之外,JVM 还会维护自动构建的系统范围的默认组

(1)在构建时不指定组的异步通道绑定到默认组

(2)默认组具有相关联的线程池,根据需要创建新线程

(3)默认组可以通过定义的系统属性进行配置

(4)如果默认组的 ThreadFactory 没有被配置,那么默认组的线程池就是守护线程

5、系统属性

(1)java.nio.channels.DefaultThreadPool.threadFactory:此属性的值被认为是具体的 ThreadFactory 类的全称,该类使用系统类加载器加载并实例化,该工厂的 newThread 方法被调用,为默认组的线程池创建每个线程,如果加载和实例化属性值的过程失败,那么在构建默认组的过程中会抛出一个未指明的错误

(2)java.nio.channels.DefaultThreadPool.initialSize:默认组的 initialSize 参数的值(见 withCachedThreadPool),该属性的值被认为是一个整数的字符串表示,是初始大小参数,如果该值不能被解析为一个整数,那么在构建默认组的过程中就会产生一个未指定的错误

6、线程

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

(2)在 I / O 操作立即完成的情况下,启动线程是组中的一个汇集线程,那么完成处理程序可能会被启动线程直接调用

(3)为了避免堆栈溢出,实现可能会对线程堆栈上的激活次数施加限制

(4)一些 I / O 操作可能会禁止直接由启动线程调用完成处理程序(请参阅 accept)

7、关机和终止

(1)shutdown 方法用于启动组的有序关闭,有序关闭将该组标记为关机,进一步尝试构建与该组绑定的通道将会抛出 ShutdownChannelGroupException

(2)一个组是否关机可以使用 isShutdown 方法进行测试

(3)一旦关闭,组结束时被绑定到该组的所有异步通道关闭,所有正在执行的完成处理程序已运行到完成,并通过该组使用的资源被释放,不会尝试停止或中断执行完成处理程序的线程

(4)isTerminated 方法用于测试组是否已经终止,并且可以使用 awaitTermination 方法来阻止该组终止

(5)shutdownNow 方法可用于启动组的强制关闭,除了通过有序关闭执行的操作外,shutdownNow 方法将关闭组中的所有打开通道,就像调用 close 方法一样

 

AsynchronousServerSocketChannel

public abstract class AsynchronousServerSocketChannel
extends Object
implements AsynchronousChannel, NetworkChannel

1、用于面向流的监听 Socket 的异步通道

2、通过调用此类的 open 方法创建 AsynchronousServerSocketChannel

3、新创建的 AsynchronousServerSocketChannel 已打开但尚未绑定,它可以绑定到本地地址,并配置为通过调用 bind 方法监听连接

4、一旦绑定,accept 方法用于启动接受通道 Socket 的连接

5、在未绑定的通道上尝试调用 accept 方法将导致抛出 NotYetBoundException

6、这种类型的通道可以安全地被多个并发线程使用,尽管在任何时候最多只能接受一个操作未完成,如果线程在先前的接受操作完成之前启动接受操作,那么将抛出一个 AcceptPendingException

7、套接字选项使用 setOption 方法进行配置,此类型的频道支持以下选项:

(1)SO_RCVBUF:套接字接收缓冲区的大小

(2)SO_REUSEADDR:重用地址

(3)支持附加(其他实现)选项

 

AsynchronousSocketChannel

public abstract class AsynchronousSocketChannel
extends Object
implements AsynchronousByteChannel, NetworkChannel

1、用于面向流的连接 Socket 的异步通道

2、AsynchronousSocketChannel 由以下两种方式之一创建

(1)一个新创建的 AsynchronousSocketChannel 是通过调用这个类所定义的一个 open 方法来创建的

(2)一个新创建的通道是开放的,但还没有连接,当连接到 AsynchronousServerSocketChannel 的 Socket 时,一个连接的 AsynchronousSocketChannel 被创建

3、不可能为一个任意的、预先存在的 Socket 创建一个 AsynchronousServerSocketChannel

4、新创建的通道通过调用其 connect 方法进行连接

(1)一旦连接,通道保持连接,直到它被关闭

(2)是否连接 SocketChannel 可以通过调用其 getRemoteAddress 方法来确定

(3)尝试在未连接的通道上调用 I / O 操作将导致抛出 NotYetConnectedException

5、这种类型的通道可以安全地被多个并发线程使用

(1)它们支持并发读写,但最多只能读取一次读写操作,一次写操作可以随时进行

(2)如果线程在先前的读取操作完成之前,启动了读取操作,那么将抛出一个 ReadPendingException

(3)在前一次写入完成之前,尝试启动写入操作将抛出一个 WritePendingException

6、SocketOption 使用 setOption 方法进行配置,AsynchronousSocketChannel 支持以下选项

(1)SO_SNDBUF:套接字发送缓冲区的大小

(2)SO_RCVBUF:套接字接收缓冲区的大小

(3)SO_KEEPALIVE:保持连接状态

(4)SO_REUSEADDR:重复使用地址

(5)TCP_NODELAY:禁用 Nagle 算法

(6)支持其他实现的选项

7、超时

(1)此类定义的 read 和 write 方法允许在启动读或写操作时指定超时

(2)如果在操作完成之前超时,则操作将以异常 InterruptedByTimeoutException 完成

(3)超时可能会使通道或底层连接处于不一致的状态

(4)在实现不能保证字节没有从通道读取的情况下,它将通道置于实现特定的错误状态,随后尝试启动 read 操作会引起未指定的运行时异常

(5)如果 write 操作超时,并且实现不能保证字节尚未被写入通道,则进一步尝试向通道发送 write,导致未指定的运行时异常被抛出

(6)当超时过后,I/O 操作的 ByteBuffer 或缓冲区序列的状态没有被定义,缓冲区应该被丢弃,或者至少必须注意确保在通道保持开放时不访问缓冲区

(7)所有接受超时参数的方法都将小于或等于零的值视为 I/O 操作不超时

 

AsynchronousFileChannel

public abstract class AsynchronousFileChannel
extends Object
implements AsynchronousChannel

1、用于读取,写入和操作文件的异步通道

2、当通过调用此类定义的 open 方法之一来打开文件时,将创建 AsynchronousFileChannel

(1)该文件包含可以读写的可变长度的字节序列,当前大小可以是 queried

(2)当字节写入超过其当前大小时,文件的大小会增加

(3)文件大小在 truncated 时会减小

3、AsynchronousFileChannel 在文件中没有当前位置

(1)而是将文件位置指定给启动异步操作的每个读写方法

(2)CompletionHandler 被指定为参数,并被调用以消耗 I / O 操作的结果

4、该类还定义了启动异步操作的读取和写入方法

(1)返回一个 Future 以表示待处理的操作结果

(2)Future 可用于检查操作是否完成,等待其完成,并检索结果

5、除了读写操作之外,此类还定义了以下操作

(1)对文件进行的更新可能是底层存储设备的 forced out,以确保在系统崩溃时数据不会丢失

(2)文件的一个区域可能是其他程序访问的 locked

6、一个 AsynchronousFileChannel 与一个线程池相关联

(1)任务被提交以处理 I/O 事件,并分派给完成处理程序,以消耗通道上 I/O 操作的结果

(2)在通道上发起的 I/O 操作的完成处理程序,被保证由线程池中的一个线程调用(这确保完成处理程序由具有预期身份的线程运行)

(3)如果一个 I/O 操作立即完成,并且启动线程本身就是线程池中的一个线程,那么完成处理程序可以由启动线程直接调用

(4)当一个 AsynchronousFileChannel 被创建而没有指定一个线程池时,那么该通道就与一个系统依赖的默认线程池相关联,该线程池可能与其他通道共享,默认的线程池是由 AsynchronousChannelGroup 类定义的系统属性配置的

7、这种类型的通道对于多个并发线程的使用是安全的

(1)close 方法可以在任何时候被调用,这将导致通道上所有未完成的异步操作以异常 AsynchronousCloseException 完成

(2)多个读和写操作可能同时未完成,当多个读写操作未完成时,I/O 操作的顺序以及完成处理程序被调用的顺序没有被指定,它们并不特别保证按照操作开始的顺序执行

(3)读取或写入时使用的 ByteBuffers 对于多个并发的 I/O 操作是不安全的

(4)此外,在一个 I/O 操作开始后,应注意确保在操作完成之前不访问缓冲区

8、和 FileChannel 一样,这个类的一个实例所提供的文件视图,保证与同一程序中其他实例所提供的同一文件的视图一致

(1)由于底层操作系统的缓存和网络文件系统协议引起的延迟,这个类的实例提供的视图可能与其他同时运行的程序看到的视图一致,也可能不一致

(2)不管这些程序是用什么语言编写的,也不管它们是在同一台机器上还是在其他机器上运行,都是如此,任何此类不一致的确切性质都是与系统相关的,因此没有明确说明

posted @   半条咸鱼  阅读(34)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示