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()方法类似。

posted @ 2017-01-31 00:15  JintaoXIAO  阅读(608)  评论(0编辑  收藏  举报