Asynchronous I/O
java.nio.channels.AsynchronousChannel
支持异步io操作。异步io操作通过返回一个_future_对象,或者是通过_completion handler_回调实现。
Future<V> operation(...)
:调用后快速返回一个java.util.concurrent.Future<V>
接口的对象,V代表具体操作的返回值。通过调用Future的方法,检查io操作是否完成,来决定时继续等待还是获取结果void operation(... A attachment, CompletionHandler<V, ? super A> handler)
:attachemt作为回调过程中的上下文传递媒介,handler是java.nio.channels.CompletionHandler<V,A>
的实例。当操作结束时,会自动调用handler的相应方法
CompletionHandler
声明如下方法:
void completed(V result, A attachment)
:操作成功则调用,result即为操作的返回结果void failed(Throwable t, A attachment)
:失败调用
以上方法被调用后,会立即返回。通过你提供的CompletingHandler或返回的Future对象来处理io操作的结果。
Future的方法boolean cancel(boolean mayInterruptIfRunning)
用于取消正在执行的操作。该方法会引起所有等待io操作结果的线程抛出java.util.concurrent.CancelationException
。而潜在的io操作是基于实现特定的,即不确定的。如果取消操作使得它相关的通道或实体处于不一致状态,那么通道会依据不同实现,进入错误状态,从而禁止进一步的io操作。例如,如果一个操作取消,但是具体实现并不保证没有从通道中读取字节,那么就像通道置于错误状态。后续的操作会抛出运行时异常。同样,如果一个操作取消,但是实现不保证是否有字节写入通道,也是一样的做法。
如果cancel()
方法的_mayInterruptIfRunning_设置为true,io操作可能会由于关闭通道而中断。这种情况,所有等待该io操作结果的线程抛出CancellationException
。而其它线程操作该通道时,会抛出java.nio.channels.AsynchronousCloseException
异常。
当通过cancel()
来取消读写操作时,建议放弃该操作的缓冲,或者使这些缓冲不让外界访问。
_AsynchronousChannel_继承自java.nio.channels.Channel
接口,继承了isOpen()
和close()
方法。
close()
方法遵循如下约定:
任何在该通道上输出的异步操作抛出AsynchronousCloseException
。当通道关闭,后续再发起异步操作会立即结束,同时抛出java.nio.channels.ClosedChannelException
。
java.nio.channels.AsynchronousByteChannel
接口继承自AsynchronousChannel
,提供四个方法:
Future<Integer> read(ByteBuffer dst)
<A> void read(ByteBuffer dst, A attachment, Integer,? super A> handler)
Future<Integer> write(ByteBuffer src)
<A> void write(ByteBuffer src, A attachment, Integer,? super A> handler)
read()
方法会抛出java.nio.channels.ReadPendingException
异常,当前一次读取还没结束时,后面读取又开始的时候,write()
方法类似。