|
|||||||||
| 上一个类 下一个类 | 框架 无框架 | ||||||||
| 摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 | ||||||||
public interface ChannelGroupFuture

通道组异步操作的结果.ChannelGroupFuture是由ChannelFuture
组成.表示个别I/O操作影响通道组中的通道的结果.
通道组中所有I/O操作都是异步的.这意味着任何I/O操作立即返回,而不会保证I/O请求调用后就完成.而是会返回一个
ChannelGroupFuture实例来通知你请求成功,失败或取消结果.
它提供不同的方法让你检查I/O操作是否已经完成,等待完成,接收I/O操作结果.也允许你添加多个
ChannelGroupFutureListener以便当I/O操作完成你能收到通知.
addListener(ChannelGroupFutureListener)比await()更好addListener(ChannelGroupFutureListener),再使用await()
,因为不管在什么地方,当I/O操作完成你都可以收到通知,并执行后续任务.
addListener(ChannelGroupFutureListener)是非阻塞的.它简单的为
ChannelGroupFuture添加特定的ChannelGroupFutureListener
,并且当该future关联的I/O操作完成后I/O线程会通知这些监听器.由于它是不阻塞的,所以
ChannelGroupFutureListener 有最好的性能和资源利用率, 但是如果你不是使用事件驱动编程,它实现顺序逻辑就很棘手.
相比之下, await()是阻塞操作.一旦调用,调用线程会阻塞直到所有I/O操作完成为止.虽然使用await()
可以很简单的实现一个顺序逻辑
,但是调用线程会不必要的阻塞直到所有I/O操作完成和相当昂贵的交互线程通知的开销.而且,在特别情况下还有可能会出现死锁,如下所描述.
ChannelHandler里面调用await()
ChannelHandler的事件处理方法会经常被I/O线程调用,除了ChannelPipeline里的
ExecutionHandler.如果await()
被一个I/O线程调用的事件处理方法调用,该I/O操作会是一个永远不会完成一直等待的操作,因为await()
会阻塞该I/O操作,所以是一个死锁.
// BAD - 别这么做@Overridepublic void messageReceived(ChannelHandlerContextctx,MessageEvente) { if (e.getMessage() instanceof ShutdownMessage) {ChannelGroupallChannels = MyServer.getAllChannels();ChannelGroupFuturefuture = allChannels.close(); future.awaitUninterruptibly(); // Perform post-shutdown operation // ... } } // GOOD@Overridepublic void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { if (e.getMessage() instanceof ShutdownMessage) {ChannelGroupallChannels = MyServer.getAllChannels();ChannelGroupFuturefuture = allChannels.close(); future.addListener(newChannelGroupFutureListener() { public void operationComplete(ChannelGroupFuturefuture) { // Perform post-closure operation // ... } }); } }
尽管有以上提到的缺点,在某些情况下,调用await()会更方便.在这种情况下,请确保你没有在一个I/O线程里调用
await().否则,会抛出IllegalStateException异常以防止死锁.
| 方法摘要 | |
|---|---|
void |
addListener(ChannelGroupFutureListener listener)
添加指定监听器到该future.当该future完成 时该监听器会收到通知.如果该future已经完成,监听器会马上收到通知. |
ChannelGroupFuture |
await()
等该该future完成. |
boolean |
await(long timeoutMillis)
在指定的时间限制内等待future的完成. |
boolean |
await(long timeout,
java.util.concurrent.TimeUnit unit)
在指定的时间限制内等待future的完成. |
ChannelGroupFuture |
awaitUninterruptibly()
等待该future完成.该方法会捕捉 InterruptedException并安静丢弃. |
boolean |
awaitUninterruptibly(long timeoutMillis)
在指定的时间限制内等待future的完成.该方法会捕捉 InterruptedException并丢弃异常. |
boolean |
awaitUninterruptibly(long timeout,
java.util.concurrent.TimeUnit unit)
在指定的时间限制内等待future的完成.该方法会捕捉 InterruptedException并丢弃异常. |
ChannelFuture |
find(Channel channel)
返回匹配指定 Channel关联的有自己I/O操作的ChannelFuture. |
ChannelFuture |
find(java.lang.Integer channelId)
返回匹配指定 ChannelID关联的有自己I/O操作的ChannelFuture. |
ChannelGroup |
getGroup()
返回该future关联的 ChannelGroup. |
boolean |
isCompleteFailure()
只有该future关联的所有I/O操作失败才返回true. |
boolean |
isCompleteSuccess()
只有该future关联的所有I/O操作成功才返回true. |
boolean |
isDone()
只有当该future完成才返回true,不管操作是否成功、失败、或者取消. |
boolean |
isPartialFailure()
只有该future关联的I/O操作有部分失败才返回true. |
boolean |
isPartialSuccess()
只有该future关联的I/O操作有部分成功才返回true. |
java.util.Iterator<ChannelFuture> |
iterator()
返回枚举该future关联的所有 ChannelFuture的Iterator.请注意返回的
Iterator是不可修改的,也就是说ChannelFuture不会被移除. |
void |
removeListener(ChannelGroupFutureListener listener)
移除指定的监听器.当该future完成 ,该监听器不再收到通知.如果该future已经完成,该方法不会有任何效果. |
| 方法详细信息 |
|---|
ChannelGroup getGroup()
ChannelGroup.
ChannelFuture find(java.lang.Integer channelId)
ChannelID关联的有自己I/O操作的ChannelFuture.
ChannelFuture.否则返回null.ChannelFuture find(Channel channel)
Channel关联的有自己I/O操作的ChannelFuture.
ChannelFuture.否则返回null.boolean isDone()
boolean isCompleteSuccess()
boolean isPartialSuccess()
boolean isCompleteFailure()
boolean isPartialFailure()
void addListener(ChannelGroupFutureListener listener)
void removeListener(ChannelGroupFutureListener listener)
ChannelGroupFuture await()
throws java.lang.InterruptedException
java.lang.InterruptedException - 如果当前线程被打断则抛出异常ChannelGroupFuture awaitUninterruptibly()
InterruptedException并安静丢弃.
boolean await(long timeout,
java.util.concurrent.TimeUnit unit)
throws java.lang.InterruptedException
java.lang.InterruptedException - 如果当前线程被打断则抛出异常
boolean await(long timeoutMillis)
throws java.lang.InterruptedException
java.lang.InterruptedException - 如果当前线程被打断则抛出异常
boolean awaitUninterruptibly(long timeout,
java.util.concurrent.TimeUnit unit)
InterruptedException并丢弃异常.
boolean awaitUninterruptibly(long timeoutMillis)
InterruptedException并丢弃异常.
java.util.Iterator<ChannelFuture> iterator()
ChannelFuture的Iterator.请注意返回的
Iterator是不可修改的,也就是说ChannelFuture不会被移除.
java.lang.Iterable<ChannelFuture> 中的 iterator
|
|||||||||
| 上一个类 下一个类 | 框架 无框架 | ||||||||
| 摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 | ||||||||