netty中IO的asynchronous详解
cookqq ›博客列表 ›netty

netty中IO的asynchronous详解

2016-11-04 10:28:32.0|分类: netty|浏览量: 2545

摘要: The result of an asynchronous异步 {@link Channel} I/O operation. A {@link ChannelFuture} is either uncompleted or completed.Do not confuse混淆 I/O timeout and await timeout

/**

 * The result of an asynchronous异步 {@link Channel} I/O operation.

 * <p>

 * All I/O operations in Netty are asynchronous.  It means any I/O calls will

 * return immediately立即 with no guarantee保证 that the requested I/O operation has

 * been completed at the end of the call.  Instead, you will be returned with

 * a {@link ChannelFuture} instance which gives you the information about the

 * result or status of the I/O operation.

 * <p>

 * A {@link ChannelFuture} is either <em>uncompleted</em> or <em>completed</em>.

 * When an I/O operation begins, a new future object is created.  The new future

 * is uncompleted initially - it is neither succeeded, failed, nor cancelled

 * because the I/O operation is not finished yet.  If the I/O operation is

 * finished either successfully, with failure, or by cancellation, the future is

 * marked as completed with more specific information, such as the cause of the

 * failure.  Please note that even failure and cancellation belong to the

 * completed state.

 * <pre>

blob.png

 * </pre>

 *

 * Various各种各样的 methods are provided to let you check if the I/O operation has been

 * completed, wait for the completion, and retrieve the result of the I/O

 * operation. It also allows you to add {@link ChannelFutureListener}s so you

 * can get notified when the I/O operation is completed.

 *

 * <h3>Prefer {@link #addListener(GenericFutureListener)} to {@link #await()}</h3>

 *

 * It is recommended to prefer {@link #addListener(GenericFutureListener)} to

 * {@link #await()} wherever possible to get notified when an I/O operation is

 * done and to do any follow-up tasks.

 * <p>

 * {@link #addListener(GenericFutureListener)} is non-blocking.  It simply adds

 * the specified {@link ChannelFutureListener} to the {@link ChannelFuture}, and

 * I/O thread will notify the listeners when the I/O operation associated with

 * the future is done.  {@link ChannelFutureListener} yields the best

 * performance and resource utilization because it does not block at all, but

 * it could be tricky to implement a sequential logic if you are not used to

 * event-driven programming.

 * <p>

 * By contrast相比之下, {@link #await()} is a blocking阻碍 operation.  Once called, the

 * caller thread blocks阻塞 until the operation is done.  It is easier to implement

 * a sequential logic时序逻辑 with {@link #await()}, but the caller thread blocks

 * unnecessarily不必要地 until the I/O operation is done and there's relatively

 * expensive昂贵的 cost of inter-thread线程间通知 notification.  Moreover, there's a chance of

 * dead lock in a particular circumstance, which is described below.

 *

 * <h3>Do not call {@link #await()} inside {@link ChannelHandler}</h3>

 * <p>

 * The event handler methods in {@link ChannelHandler} is usually called by

 * an I/O thread.  If {@link #await()} is called by an event handler

 * method, which is called by the I/O thread, the I/O operation it is waiting

 * for might never be complete because {@link #await()} can block the I/O

 * operation it is waiting for, which is a dead lock.

 * <pre>

 * // BAD - NEVER DO THIS

 * {@code @Override}

 * public void channelRead({@link ChannelHandlerContext} ctx, GoodByeMessage msg) {

 *     {@link ChannelFuture} future = ctx.channel().close();

 *     future.awaitUninterruptibly();//awaitUninterruptibly 是阻塞方法,等待write写完,线程才继续往下进行

 *     // Perform post-closure operation

 *     // ...

 * }

 *

 * // GOOD

 * {@code @Override}

 * public void channelRead({@link ChannelHandlerContext} ctx,  GoodByeMessage msg) {

 *     {@link ChannelFuture} future = ctx.channel().close();

 *     future.addListener(new {@link ChannelFutureListener}() {

 *         public void operationComplete({@link ChannelFuture} future) {

 *             // Perform post-closure operation

 *             // ...

 *         }

 *     });

 * }

 * </pre>

 * <p>

 * In spite恶意 of the disadvantages mentioned提到的缺点 above, there are certainly肯定 the cases

 * where it is more convenient使用的 to call {@link #await()}. In such a case, please

 * make sure you do not call {@link #await()} in an I/O thread.  Otherwise,

 * {@link BlockingOperationException} will be raised to prevent a dead lock.

 *

 * <h3>Do not confuse混淆 I/O timeout and await timeout</h3>

 *

 * The timeout value you specify with {@link #await(long)},

 * {@link #await(long, TimeUnit)}, {@link #awaitUninterruptibly(long)}, or

 * {@link #awaitUninterruptibly(long, TimeUnit)} are not related有关系的 with I/O

 * timeout at all.  If an I/O operation times out, the future will be marked as

 * 'completed with failure,' as depicted in the diagram above.  For example,

 * connect timeout should be configured via a transport-specific option:

 * <pre>

 * // BAD - NEVER DO THIS

 * {@link Bootstrap} b = ...;

 * {@link ChannelFuture} f = b.connect(...);

 * f.awaitUninterruptibly(10, TimeUnit.SECONDS);

 * if (f.isCancelled()) {

 *     // Connection attempt cancelled by user

 * } else if (!f.isSuccess()) {

 *     // You might get a NullPointerException here because the future

 *     // might not be completed yet.

 *     f.cause().printStackTrace();

 * } else {

 *     // Connection established successfully

 * }

 *

 * // GOOD

 * {@link Bootstrap} b = ...;

 * // Configure the connect timeout option.

 * <b>b.option({@link ChannelOption}.CONNECT_TIMEOUT_MILLIS, 10000);</b>

 * {@link ChannelFuture} f = b.connect(...);

 * f.awaitUninterruptibly();

 *

 * // Now we are sure the future is completed.

 * assert f.isDone();

 *

 * if (f.isCancelled()) {

 *     // Connection attempt cancelled by user

 * } else if (!f.isSuccess()) {

 *     f.cause().printStackTrace();

 * } else {

 *     // Connection established successfully

 * }

 * </pre>

 */


一键分享文章

分类列表

  • • struts源码分析
  • • flink
  • • struts
  • • redis
  • • kafka
  • • ubuntu
  • • zookeeper
  • • hadoop
  • • activiti
  • • linux
  • • 成长
  • • NIO
  • • 关键词提取
  • • mysql
  • • android studio
  • • zabbix
  • • 云计算
  • • mahout
  • • jmeter
  • • hive
  • • ActiveMQ
  • • lucene
  • • MongoDB
  • • netty
  • • flume
  • • 我遇到的问题
  • • GRUB
  • • nginx
  • • 大家好的文章
  • • android
  • • tomcat
  • • Python
  • • luke
  • • android源码编译
  • • 安全
  • • MPAndroidChart
  • • swing
  • • POI
  • • powerdesigner
  • • jquery
  • • html
  • • java
  • • eclipse
  • • shell
  • • jvm
  • • highcharts
  • • 设计模式
  • • 列式数据库
  • • spring cloud
  • • docker+node.js+zookeeper构建微服务
版权所有 cookqq 感谢访问 支持开源 京ICP备15030920号
CopyRight 2015-2018 cookqq.com All Right Reserved.