|
||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||
| SUMMARY: REQUIRED | OPTIONAL | DETAIL: ELEMENT | |||||||
@Documented @Target(value=METHOD) @Retention(value=RUNTIME) public @interface Reentrant
Specifies that a synchronous call can be executed within the context of an existing agent call without blocking. This is best illustrated with an example:
interface Printer {
void print(String text);
int getCount();
void mark(Runnable runnable);
}
class PrinterTask {
private int count = 0;
void print(String text) {
System.out.println(text);
count++;
}
@Reentrant
int getCount() {
return count;
}
@Marker
void mark(Runnable runnable) {
runnable.run();
}
}
class PrinterTest {
void run() {
final Printer printer = Agent.newInstance(Printer.class, new PrinterTask());
for (int i = 0; i < 3; i++) {
printer.print("Print test #" + i);
}
printer.mark(new Runnable(){
public void run() {
System.out.println("Finished: count=" + printer.getCount());
}
});
}
}
The task's mark method calls the test's runnable
object which in turn calls the agent's getCount method. This
would deadlock without the Reentrant annotation. The task's
mark method would wait indefinitely for the
runnable's synchronous call to getCount to return.
But the agent would not execute the getCount call until the
mark call has finished.
The Reentrant annotation tells the agent to call the task's
getCount method immediately instead of queuing it. This
annotation only applies to synchronous calls made to the same agent within an
existing call; otherwise, the call is queued normally and the caller waits as
usual. This implies reentrant agent calls are always executed within the same
thread context, and so no thread synchronization is required of the task.
Furthermore, in the case of agents with multiple tasks, the agent executes
reentrant calls using the same task.
Call state listeners (see CallStateListener) can only rely on
Reentrant call semantics within the context of an executing
task, such as when a call transitions to CallState.EXECUTING.
|
||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||
| SUMMARY: REQUIRED | OPTIONAL | DETAIL: ELEMENT | |||||||