Author: fhanik Date: Wed Mar 21 18:21:25 2007 New Revision: 521068 URL: http://svn.apache.org/viewvc?view=rev&rev=521068 Log: Make sure that we don't need to use any locks or synchronized statements to get our executor to work properly. If the task gets executed, means that the threadpool just reached max threads when we were about to add this one in. a simple race condition that we can take care of easily
Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardThreadExecutor.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardThreadExecutor.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardThreadExecutor.java?view=diff&rev=521068&r1=521067&r2=521068 ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardThreadExecutor.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardThreadExecutor.java Wed Mar 21 18:21:25 2007 @@ -11,6 +11,7 @@ import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleListener; import org.apache.catalina.util.LifecycleSupport; +import java.util.concurrent.RejectedExecutionException; public class StandardThreadExecutor implements Executor { @@ -59,8 +60,14 @@ } public void execute(Runnable command) { - if ( executor != null ) executor.execute(command); - else throw new IllegalStateException("StandardThreadPool not started."); + if ( executor != null ) { + try { + executor.execute(command); + } catch (RejectedExecutionException rx) { + //there could have been contention around the queue + if ( !( (TaskQueue) executor.getQueue()).force(command) ) throw new RejectedExecutionException(); + } + } else throw new IllegalStateException("StandardThreadPool not started."); } public int getThreadPriority() { @@ -171,10 +178,15 @@ public void setParent(ThreadPoolExecutor tp) { parent = tp; } + + public boolean force(Runnable o) { + if ( parent.isShutdown() ) throw new RejectedExecutionException(); + return super.offer(o); //forces the item onto the queue, to be used if the task is rejected + } public boolean offer(Runnable o) { if (parent != null && parent.getPoolSize() < parent.getMaximumPoolSize()) - return false; //force creation of new threads + return false; //force creation of new threads by rejecting the task else return super.offer(o); } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]