<!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><SPAN class=167141103-12052009><FONT face="Courier New" color=#0000ff 
size=2>Ashwin,</FONT></SPAN></DIV>
<DIV><SPAN class=167141103-12052009><FONT face="Courier New" color=#0000ff 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=167141103-12052009><FONT face="Courier New" color=#0000ff 
size=2>The DiscardOldest policy doesn't try to run rejected tasks, it tries to 
make room and re-submit them. But yes, this is done in a recursive manner (there 
is no other way to do it directly) and so it is possible that the space made is 
consumed by another submitter, and so you could get a 
StackOverflowError.</FONT></SPAN></DIV>
<DIV><SPAN class=167141103-12052009><FONT face="Courier New" color=#0000ff 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=167141103-12052009><FONT face="Courier New" color=#0000ff 
size=2>I agree the recursive aspect of this could be documented more 
clearly.</FONT></SPAN></DIV>
<DIV><SPAN class=167141103-12052009><FONT face="Courier New" color=#0000ff 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=167141103-12052009><FONT face="Courier New" color=#0000ff 
size=2>David Holmes</FONT></SPAN></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> Tuesday, 12 May 2009 12:09 PM<BR><B>To:</B> 
  concurrency-interest@cs.oswego.edu<BR><B>Subject:</B> [concurrency-interest] 
  Potential recursive failure 
  ofThreadPoolExecutor.DiscardOldestPolicy?<BR><BR></FONT></DIV>I was looking at 
  the source of <SPAN 
  style="BACKGROUND-COLOR: rgb(204,204,204)">ThreadPoolExecutor.DiscardOldestPolicy</SPAN> 
  which seems to have a rather naive way of running the rejected tasks - at 
  least it seems to me like that.<BR><BR>If the incoming jobs arrive at a faster 
  rate than the rate at which the job queue gets cleared, won't the rejected 
  task policy potentially cause a recursive stack overflow? If so, shouldn't the 
  documentation warn us about such things?<BR><BR>DiscardOldestPolicy code 
  snippet:<BR><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)">&nbsp;&nbsp;&nbsp; 
  public static class DiscardOldestPolicy implements RejectedExecutionHandler 
  {</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)">&nbsp;&nbsp;&nbsp;&nbsp; 
  .. .. .. .. </SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  if (!e.isShutdown()) {</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  e.getQueue().poll();</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  e.execute(r);</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  }</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  }</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(204,204,204)">&nbsp;&nbsp;&nbsp; 
  }</SPAN><BR><BR><BR>ThreadPoolExecutor code snippet:<BR><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp; 
  public void execute(Runnable command) {</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  .. .. ....</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  for (;;) {</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  if (runState != RUNNING) {</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  reject(command);</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  return;</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  }</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  if (poolSize &lt; corePoolSize &amp;&amp; 
  addIfUnderCorePoolSize(command))</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  return;</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  if (workQueue.offer(command))</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  return;</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  Runnable r = addIfUnderMaximumPoolSize(command);</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  if (r == command)</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  return;</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  if (r == null) {</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  reject(command);</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  return;</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  }</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  // else retry</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  }</SPAN><BR 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)"><SPAN 
  style="FONT-FAMILY: tahoma,sans-serif; BACKGROUND-COLOR: rgb(192,192,192)">&nbsp;&nbsp;&nbsp; 
  }</SPAN><BR><BR>Ashwin.<BR></BLOCKQUOTE></BODY></HTML>