public interface ChannelFuture extends Future<java.lang.Void>
Channel
I / O操作的结果。
Netty中的所有I / O操作都是异步的。 这意味着任何I / O调用都将立即返回,不保证在呼叫结束时所请求的I / O操作已完成。 相反,您将返回一个ChannelFuture
实例,该实例向您提供有关I / O操作结果或状态的信息。
A ChannelFuture
要么未完成,要么完成 。 当I / O操作开始时,将创建一个新的未来对象。 新的未来最初并未完成 - 由于I / O操作尚未完成,因此既未成功,也未能取消,也未取消。 如果I / O操作成功完成,出现故障或取消,未来将被标记为已完成并包含更多具体信息,例如故障原因。 请注意,即使失败和取消也属于完成状态。
+---------------------------+
| Completed successfully |
+---------------------------+
+----> isDone() = true |
+--------------------------+ | | isSuccess() = true |
| Uncompleted | | +===========================+
+--------------------------+ | | Completed with failure |
| isDone() = false | | +---------------------------+
| isSuccess() = false |----+----> isDone() = true |
| isCancelled() = false | | | cause() = non-null |
| cause() = null | | +===========================+
+--------------------------+ | | Completed by cancellation |
| +---------------------------+
+----> isDone() = true |
| isCancelled() = true |
+---------------------------+
提供了各种方法让您检查I / O操作是否已完成,等待完成并检索I / O操作的结果。
它还允许您添加ChannelFutureListener
,以便在I / O操作完成时收到通知。
addListener(GenericFutureListener)
至await()
addListener(GenericFutureListener)
至await()
,以便在I / O操作完成时收到通知并执行任何后续任务。
addListener(GenericFutureListener)
是非阻塞的。 它只是将指定的ChannelFutureListener
添加到ChannelFuture
,并且I / O线程将在与未来相关的I / O操作完成时通知监听器。 ChannelFutureListener
可以产生最佳的性能和资源利用率,因为它根本不会阻塞,但如果您不习惯于事件驱动的编程,则实现顺序逻辑可能会非常棘手。
相比之下, await()
是一项阻止操作。 一旦被调用,调用者线程将阻塞,直到操作完成。 使用await()
实现顺序逻辑更容易,但调用者线程不必要地阻塞,直到I / O操作完成,并且线程间通知的代价相对较高。 此外,在下面描述的特定情况下存在死锁的可能性。
await()
内ChannelHandler
ChannelHandler
中的事件处理程序方法通常由I / O线程调用。 如果await()
由I / O线程调用的事件处理程序方法调用,则它正在等待的I / O操作可能永远不会完成,因为await()
可能会阻止它正在等待的I / O操作,这是一个死锁。
// BAD - NEVER DO THIS
@Override
public void channelRead(ChannelHandlerContext
ctx, Object msg) {
ChannelFuture
future = ctx.channel().close();
future.awaitUninterruptibly();
// Perform post-closure operation
// ...
}
// GOOD
@Override
public void channelRead(ChannelHandlerContext
ctx, Object msg) {
ChannelFuture
future = ctx.channel().close();
future.addListener(new ChannelFutureListener
() {
public void operationComplete(ChannelFuture
future) {
// Perform post-closure operation
// ...
}
});
}
尽管存在上述缺点,但确实有更方便拨打await()
的情况 。 在这种情况下,请确保在I / O线程中不要调用await()
。 否则,将提高BlockingOperationException
以防止死锁。
Future.await(long)
, Future.await(long, TimeUnit)
, Future.awaitUninterruptibly(long)
,或Future.awaitUninterruptibly(long, TimeUnit)
不与我有关/ O超时的。
如果I / O操作超时,未来将被标记为“完成并失败”,如上图所示。
例如,连接超时应通过传输特定选项进行配置:
// BAD - NEVER DO THIS
Bootstrap
b = ...;
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
Bootstrap
b = ...;
// Configure the connect timeout option.
b.option(ChannelOption
.CONNECT_TIMEOUT_MILLIS, 10000);
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
}
await, await, awaitUninterruptibly, awaitUninterruptibly, cancel, cause, getNow, isCancellable, isSuccess
Channel channel()
ChannelFuture addListener(GenericFutureListener<? extends Future<? super java.lang.Void>> listener)
Future
复制的描述
ChannelFuture addListeners(GenericFutureListener<? extends Future<? super java.lang.Void>>... listeners)
Future
ChannelFuture removeListener(GenericFutureListener<? extends Future<? super java.lang.Void>> listener)
Future
复制的描述
ChannelFuture removeListeners(GenericFutureListener<? extends Future<? super java.lang.Void>>... listeners)
Future
ChannelFuture sync() throws java.lang.InterruptedException
Future
java.lang.InterruptedException
ChannelFuture syncUninterruptibly()
Future
ChannelFuture await() throws java.lang.InterruptedException
Future
复制的描述
java.lang.InterruptedException
- 如果当前线程中断
ChannelFuture awaitUninterruptibly()
Future
InterruptedException
并静默放弃它。
boolean isVoid()
ChannelFuture
是一个无效的未来,并且不允许调用以下任何方法,则返回true
:
Copyright © 2008–2018 The Netty Project. All rights reserved.