public abstract class IteratingCallback extends Object implements Callback
A typical example is the write of a large content to a socket, divided in chunks. Chunk C1 is written by thread T1, which also invokes the callback, which writes chunk C2, which invokes the callback again, which writes chunk C3, and so forth.
The problem with the example is that if the callback thread is the same that performs the I/O operation, then the process is recursive and may result in a stack overflow. To avoid the stack overflow, a thread dispatch must be performed, causing context switching and cache misses, affecting performance.
To avoid this issue, this callback uses an AtomicReference to record whether success callback has been called during the processing of a sub task, and if so then the processing iterates rather than recurring.
Subclasses must implement method process()
where the sub
task is executed and a suitable IteratingCallback.Action
is
returned to this callback to indicate the overall progress of the job.
This callback is passed to the asynchronous execution of each sub
task and a call the succeeded()
on this callback represents
the completion of the sub task.
Callback.Completable, Callback.Completing, Callback.InvocableCallback, Callback.Nested
Invocable.InvocationType
__nonBlocking
Modifier and Type | Method and Description |
---|---|
void |
close() |
void |
failed(Throwable x)
Invoked when the sub task fails.
|
boolean |
isClosed() |
boolean |
isFailed() |
boolean |
isSucceeded() |
void |
iterate()
This method must be invoked by applications to start the processing
of sub tasks.
|
boolean |
reset()
Resets this callback.
|
void |
succeeded()
Invoked when the sub task succeeds.
|
String |
toString() |
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
combine, from, from, from, from, from, from
combine, getInvocationType, getInvocationType, invokeNonBlocking, isNonBlockingInvocation
public void iterate()
process()
method will
be called during or soon after, either by the calling thread or by
another thread.public void succeeded()
super.succeeded()
.succeeded
in interface Callback
Callback.failed(Throwable)
public void failed(Throwable x)
super.failed(Throwable)
.public void close()
public boolean isClosed()
public boolean isFailed()
public boolean isSucceeded()
public boolean reset()
A callback can only be reset to IDLE from the SUCCEEDED or FAILED states or if it is already IDLE.
Copyright © 2010 - 2020 Adobe. All Rights Reserved