final ReactorPoolThread currentThread = (ReactorPoolThread) Thread
.currentThread();
while (true) {
try {
taskRequest.acquire();
PoolThreadReactorMtImpl reactor = reactors.poll();
if (reactor != null) {
AtomicReference<Thread> threadReference = reactor
.getThreadReference();
if ((threadReference.get() == null)
&& threadReference.compareAndSet(null,
currentThread)) {
currentThread.setCurrentReactor(reactor);
while (true) {
try {
reactor.run();
} catch (final MigrationException me) {
final boolean hasWork = reactor
.hasWork();
threadReference.set(null);
if (reactor.isIdler() || hasWork
|| reactor.hasConcurrent()) {
execute(reactor);
}
reactor = me.reactor;
threadReference = reactor
.getThreadReference();
currentThread
.setCurrentReactor(reactor);
continue;
} catch (final Throwable e) {
logger.error(
"Exception thrown by a targetReactor's run method",
e);
}
final boolean hasWork = reactor.hasWork();
threadReference.set(null);
if (hasWork || reactor.hasConcurrent()) {
execute(reactor);
}
break;
}
currentThread.setCurrentReactor(null);