Eat what you kill strategy avoids double dispatch

This commit is contained in:
Greg Wilkins 2014-07-31 08:58:19 +10:00
parent 489830a0b2
commit e415de44c6
1 changed files with 6 additions and 2 deletions

View File

@ -59,7 +59,6 @@ public abstract class ExecutionStrategy implements Runnable
_executor=executor; _executor=executor;
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
/** Simple iterative strategy. /** Simple iterative strategy.
* Iterate over production until complete and execute each task. * Iterate over production until complete and execute each task.
@ -113,6 +112,7 @@ public abstract class ExecutionStrategy implements Runnable
{ {
private final AtomicInteger _threads = new AtomicInteger(0); private final AtomicInteger _threads = new AtomicInteger(0);
private final AtomicReference<Boolean> _producing = new AtomicReference<Boolean>(Boolean.FALSE); private final AtomicReference<Boolean> _producing = new AtomicReference<Boolean>(Boolean.FALSE);
private volatile boolean _dispatched;
public EatWhatYouKill(Producer producer, Executor executor) public EatWhatYouKill(Producer producer, Executor executor)
{ {
@ -121,6 +121,7 @@ public abstract class ExecutionStrategy implements Runnable
public void run() public void run()
{ {
_dispatched=false;
// count the dispatched threads // count the dispatched threads
_threads.incrementAndGet(); _threads.incrementAndGet();
try try
@ -146,9 +147,12 @@ public abstract class ExecutionStrategy implements Runnable
} }
// then we may need another thread to keep producing // then we may need another thread to keep producing
if (!complete) if (!complete && !_dispatched)
{
// Dispatch a thread to continue producing // Dispatch a thread to continue producing
_dispatched=true;
_executor.execute(this); _executor.execute(this);
}
// If there is a task, // If there is a task,
if (task!=null) if (task!=null)