public interface ChannelGroupFuture extends Future<Void>, Iterable<ChannelFuture>
ChannelGroup
operation.
ChannelGroupFuture
is composed of ChannelFuture
s which
represent the outcome of the individual I/O operations that affect the
Channel
s in the ChannelGroup
.
All I/O operations in ChannelGroup
are asynchronous. It means any
I/O calls will return immediately with no guarantee that the requested I/O
operations have been completed at the end of the call. Instead, you will be
returned with a ChannelGroupFuture
instance which tells you when the
requested I/O operations have succeeded, failed, or cancelled.
Various methods are provided to let you check if the I/O operations has been
completed, wait for the completion, and retrieve the result of the I/O
operation. It also allows you to add more than one
ChannelGroupFutureListener
so you can get notified when the I/O
operation have been completed.
addListener(GenericFutureListener)
to await()
addListener(GenericFutureListener)
to
await()
wherever possible to get notified when I/O operations are
done and to do any follow-up tasks.
addListener(GenericFutureListener)
is non-blocking. It simply
adds the specified ChannelGroupFutureListener
to the
ChannelGroupFuture
, and I/O thread will notify the listeners when
the I/O operations associated with the future is done.
ChannelGroupFutureListener
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.
By contrast, await()
is a blocking operation. Once called, the
caller thread blocks until all I/O operations are done. It is easier to
implement a sequential logic with await()
, but the caller thread
blocks unnecessarily until all I/O operations are 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.
await()
inside ChannelHandler
The event handler methods in ChannelHandler
is often called by
an I/O thread. If 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 await()
can block the I/O
operation it is waiting for, which is a dead lock.
// BAD - NEVER DO THIS@Override
public void messageReceived(ChannelHandlerContext
ctx, ShutdownMessage msg) {ChannelGroup
allChannels = MyServer.getAllChannels();ChannelGroupFuture
future = allChannels.close(); future.awaitUninterruptibly(); // Perform post-shutdown operation // ... } // GOOD@Override
public void messageReceived(ChannelHandlerContext ctx, ShutdownMessage msg) {ChannelGroup
allChannels = MyServer.getAllChannels();ChannelGroupFuture
future = allChannels.close(); future.addListener(newChannelGroupFutureListener
() { public void operationComplete(ChannelGroupFuture
future) { // Perform post-closure operation // ... } }); }
In spite of the disadvantages mentioned above, there are certainly the cases
where it is more convenient to call await()
. In such a case, please
make sure you do not call await()
in an I/O thread. Otherwise,
IllegalStateException
will be raised to prevent a dead lock.
Modifier and Type | Method and Description |
---|---|
ChannelGroupFuture |
addListener(GenericFutureListener<? extends Future<? super Void>> listener)
Adds the specified listener to this future.
|
ChannelGroupFuture |
addListeners(GenericFutureListener<? extends Future<? super Void>>... listeners)
Adds the specified listeners to this future.
|
ChannelGroupFuture |
await()
Waits for this future to be completed.
|
ChannelGroupFuture |
awaitUninterruptibly()
Waits for this future to be completed without
interruption.
|
ChannelGroupException |
cause()
Returns the cause of the failed I/O operation if the I/O operation has
failed.
|
ChannelFuture |
find(Channel channel)
Returns the
ChannelFuture of the individual I/O operation which
is associated with the specified Channel . |
ChannelGroup |
group()
Returns the
ChannelGroup which is associated with this future. |
boolean |
isPartialFailure()
Returns
true if and only if the I/O operations associated with
this future have failed partially with some success. |
boolean |
isPartialSuccess()
Returns
true if and only if the I/O operations associated with
this future were partially successful with some failure. |
boolean |
isSuccess()
Returns
true if and only if all I/O operations associated with
this future were successful without any failure. |
Iterator<ChannelFuture> |
iterator()
Returns the
Iterator that enumerates all ChannelFuture s
which are associated with this future. |
ChannelGroupFuture |
removeListener(GenericFutureListener<? extends Future<? super Void>> listener)
Removes the first occurrence of the specified listener from this future.
|
ChannelGroupFuture |
removeListeners(GenericFutureListener<? extends Future<? super Void>>... listeners)
Removes the first occurrence for each of the listeners from this future.
|
ChannelGroupFuture |
sync()
Waits for this future until it is done, and rethrows the cause of the failure if this future
failed.
|
ChannelGroupFuture |
syncUninterruptibly()
Waits for this future until it is done, and rethrows the cause of the failure if this future
failed.
|
await, await, awaitUninterruptibly, awaitUninterruptibly, cancel, getNow, isCancellable
get, get, isCancelled, isDone
forEach, spliterator
ChannelGroup group()
ChannelGroup
which is associated with this future.ChannelFuture find(Channel channel)
ChannelFuture
of the individual I/O operation which
is associated with the specified Channel
.ChannelFuture
if found.
null
otherwise.boolean isSuccess()
true
if and only if all I/O operations associated with
this future were successful without any failure.ChannelGroupException cause()
Future
null
if succeeded or this future is not
completed yet.boolean isPartialSuccess()
true
if and only if the I/O operations associated with
this future were partially successful with some failure.boolean isPartialFailure()
true
if and only if the I/O operations associated with
this future have failed partially with some success.ChannelGroupFuture addListener(GenericFutureListener<? extends Future<? super Void>> listener)
Future
ChannelGroupFuture addListeners(GenericFutureListener<? extends Future<? super Void>>... listeners)
Future
ChannelGroupFuture removeListener(GenericFutureListener<? extends Future<? super Void>> listener)
Future
ChannelGroupFuture removeListeners(GenericFutureListener<? extends Future<? super Void>>... listeners)
Future
ChannelGroupFuture await() throws InterruptedException
Future
InterruptedException
- if the current thread was interruptedChannelGroupFuture awaitUninterruptibly()
Future
InterruptedException
and
discards it silently.ChannelGroupFuture syncUninterruptibly()
Future
ChannelGroupFuture sync() throws InterruptedException
Future
InterruptedException
Iterator<ChannelFuture> iterator()
Iterator
that enumerates all ChannelFuture
s
which are associated with this future. Please note that the returned
Iterator
is unmodifiable, which means a ChannelFuture
cannot be removed from this future.iterator
in interface Iterable<ChannelFuture>
Copyright © 2008–2024 The Netty Project. All rights reserved.