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.

Reply via email to