zoukankan      html  css  js  c++  java
  • 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()方法类似。

  • 相关阅读:
    (Beta)Let's-Beta阶段展示博客
    (Beta)Let's-M2后分析报告
    (Beta)Let's-版本测试报告
    (Beta)Let's-版本发布说明
    团队作业Week14
    Daily Scrum 12.20
    Daily Scrum 12.19
    Daily Scrum 12.18
    Daily Scrum 12.17
    最后一次作业
  • 原文地址:https://www.cnblogs.com/xiaojintao/p/6358552.html
Copyright © 2011-2022 走看看