Sorry Doug/Chris I should have seen this previously, the order here is
wrong:
1552 void ensurePrestart() {
1553 int wc = workerCountOf(ctl.get());
1554 if (wc == 0)
1555 addWorker(null, false);
1556 else if (wc < corePoolSize)
1557 addWorker(null, true);
1558 }
this will always mark the first worker as non-core even if the
corePoolSize is > 0. It needs to be swapped
void ensurePrestart() {
int wc = workerCountOf(ctl.get());
if (wc < corePoolSize)
addWorker(null, true);
else if (wc == 0) // corePoolSize must be 0
addWorker(null, false);
}
David
-----
On 23/09/2011 2:54 AM, Chris Hegarty wrote:
This change is coming from Doug Lea's CVS and I've already review it.
It seems that in the re-work that was done for Java 7 we dropped this
corner case.
STPE.delayedExecute will add the task to the work queue and invoke
prestartCoreThread. But prestartCoreThread checks for the worker count
(0) being less than corePoolSize (0) and as that is not the case nothing
happens. So we have a task in the queue but no thread waiting to execute
it.
For STPE when the queue is not empty there must always be at least one
thread waiting on the queue.
http://cr.openjdk.java.net/~chegar/7091003/webrev.00/webrev/
-Chris.