|
|||||||||
上一个类 下一个类 | 框架 无框架 | ||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
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 - 别这么做@Override
public void messageReceived(ChannelHandlerContext
ctx,MessageEvent
e) { if (e.getMessage() instanceof ShutdownMessage) {ChannelGroup
allChannels = MyServer.getAllChannels();ChannelGroupFuture
future = allChannels.close(); future.awaitUninterruptibly(); // Perform post-shutdown operation // ... } } // GOOD@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { if (e.getMessage() instanceof ShutdownMessage) {ChannelGroup
allChannels = MyServer.getAllChannels();ChannelGroupFuture
future = allChannels.close(); future.addListener(newChannelGroupFutureListener
() { public void operationComplete(ChannelGroupFuture
future) { // 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)
返回匹配指定 Channel ID关联的有自己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)
Channel
ID关联的有自己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
|
|||||||||
上一个类 下一个类 | 框架 无框架 | ||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |