<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2800.1625" name=GENERATOR></HEAD>
<BODY>
<DIV><FONT size=1>
<P><FONT face="Courier New" size=2>I don't think the issue here is "corePoolSize 
is less than maximumPoolSize" I think this is a particular issue with 
corePoolSize==0, and looking at the current<SPAN class=489530022-22042009> 
JDK7</SPAN>&nbsp;code I'm pretty sure this has been addressed so there is always 
at least one thread even if corePoolSize is zero.</FONT></P>
<P><FONT face="Courier New"><FONT size=2>Reme<SPAN 
class=489530022-22042009>m</SPAN>ber the way this&nbsp;<SPAN 
class=489530022-22042009>is </SPAN>supposed to work is that on a submission the 
executor creates a thread if there are less than corePoolSize threads<SPAN 
class=489530022-22042009>, else the task is queued. If the queue is bounded and 
is full then a thread is again created, provided the number of threads is less 
than maximumPoolSize.</SPAN></FONT></FONT></P>
<P><FONT face="Courier New"><FONT size=2><SPAN class=489530022-22042009>So 
unless you use a bounded queue that gets full, you will not see the number of 
threads grow from corePoolSizse to mnaxPoolSize.</SPAN></FONT></FONT></P>
<P><FONT face="Courier New"><FONT size=2><SPAN class=489530022-22042009>David 
Holmes</SPAN></FONT></FONT></P></FONT></DIV>
<BLOCKQUOTE 
style="PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #0000ff 2px solid">
  <DIV class=OutlookMessageHeader dir=ltr align=left><FONT face=Tahoma 
  size=2>-----Original Message-----<BR><B>From:</B> 
  concurrency-interest-bounces@cs.oswego.edu 
  [mailto:concurrency-interest-bounces@cs.oswego.edu]<B>On Behalf Of </B>Ashwin 
  Jayaprakash<BR><B>Sent:</B> Thursday, 23 April 2009 3:33 AM<BR><B>To:</B> 
  concurrency-interest@cs.oswego.edu<BR><B>Subject:</B> [concurrency-interest] 
  java.util.concurrent.ThreadPoolExecutor doesnot execute jobs in some 
  cases<BR><BR></FONT></DIV>Hi, I've raised a bug in the Sun Bug Database. It's 
  still under review. But here it 
  is:<BR><BR>java.util.concurrent.ThreadPoolExecutor does not execute jobs in 
  some cases.<BR><BR>If the corePoolSize if less than the maximumPoolSize, then 
  the thread pool just does not execute the submitted jobs. The jobs just sit 
  there.<BR><BR>If the corePoolSize is set to 1 instead of 0, then only 1 thread 
  executes the jobs 
  sequentially.<BR><BR>==================================================<BR>When 
  the corePoolSize is 
  0:<BR>==================================================<BR><BR>Submitting job 
  1<BR>Submitting job 2<BR>Submitting job 3<BR>Submitting job 4<BR>Shutting 
  down...<BR>Waiting for job to complete.<BR><BR>(Program never 
  exits)<BR><BR><BR>==================================================<BR>When 
  the corePoolSize is 
  1:<BR>==================================================<BR>Submitting job 
  1<BR>Submitting job 2<BR>Submitting job 3<BR>Submitting job 4<BR>Shutting 
  down...<BR>Waiting for job to complete.<BR>Starting job: 
  temp.Temp$StuckJob@140c281<BR>Finished job: 
  temp.Temp$StuckJob@140c281<BR>Waiting for job to complete.<BR>Starting job: 
  temp.Temp$StuckJob@a1d1f4<BR>Finished job: 
  temp.Temp$StuckJob@a1d1f4<BR>Waiting for job to complete.<BR>Starting job: 
  temp.Temp$StuckJob@1df280b<BR>Finished job: 
  temp.Temp$StuckJob@1df280b<BR>Waiting for job to complete.<BR>Starting job: 
  temp.Temp$StuckJob@1be0f0a<BR>Finished job: temp.Temp$StuckJob@1be0f0a<BR>Shut 
  down completed.<BR><BR>REPRODUCIBILITY :<BR>This bug can be reproduced 
  always.<BR><BR>---------- BEGIN SOURCE ----------<BR>public class Temp 
  {<BR>&nbsp;&nbsp; public static void main(String[] args) throws 
  ExecutionException, InterruptedException 
  {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ThreadPoolExecutor tpe = new 
  ThreadPoolExecutor(0, 
  512,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  3 * 60, 
  TimeUnit.SECONDS,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  new 
  LinkedBlockingQueue&lt;Runnable&gt;(),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  new SimpleThreadFactory("test"));<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  LinkedList&lt;Future&gt; futures = new 
  LinkedList&lt;Future&gt;();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  System.out.println("Submitting job 
  1");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; futures.add(tpe.submit(new 
  StuckJob()));<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  System.out.println("Submitting job 
  2");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; futures.add(tpe.submit(new 
  StuckJob()));<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  System.out.println("Submitting job 
  3");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; futures.add(tpe.submit(new 
  StuckJob()));<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  System.out.println("Submitting job 
  4");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; futures.add(tpe.submit(new 
  StuckJob()));<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  System.out.println("Shutting 
  down...");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Future future : 
  futures) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  System.out.println("Waiting for job to 
  complete.");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  future.get();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  }<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  tpe.shutdown();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  System.out.println("Shut down completed.");<BR>&nbsp;&nbsp; 
  }<BR><BR>&nbsp;&nbsp; public static class StuckJob implements Runnable 
  {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run() 
  {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try 
  {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  System.out.println("Starting job: " + 
  this);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  Thread.sleep(5000);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  System.out.println("Finished job: " + 
  this);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch 
  (InterruptedException e) 
  {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp; 
  }<BR>}<BR><BR>---------- END SOURCE ----------<BR><BR>Workaround:<BR>Set the 
  corePoolSize to be equal to the maximumPoolSize. But this is scary because if 
  the pool ever reaches its max limit then all those threads will just sit there 
  instead of shutting down after the idle time out.<BR><BR>Ashwin (<A 
  href="http://javaforu.blogspot.com">http://javaforu.blogspot.com</A>)<BR></BLOCKQUOTE></BODY></HTML>