Author: fhanik
Date: Tue Dec  9 13:22:38 2008
New Revision: 724897

URL: http://svn.apache.org/viewvc?rev=724897&view=rev
Log:
Implement an execution that adds the task to the queue if rejected, and allow 
to try to add for a specified time

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java?rev=724897&r1=724896&r2=724897&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java 
Tue Dec  9 13:22:38 2008
@@ -17,6 +17,7 @@
 package org.apache.tomcat.util.threads;
 
 import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.RejectedExecutionHandler;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
@@ -24,6 +25,8 @@
 /**
  * Same as a java.util.concurrent.ThreadPoolExecutor but implements a much 
more efficient
  * getActiveCount method, to be used to properly handle the work queue
+ * If a RejectedExecutionHandler is not specified a default one will be 
configured
+ * and that one will always throw a RejectedExecutionException
  * @author fhanik
  *
  */
@@ -41,11 +44,11 @@
     }
 
     public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long 
keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory 
threadFactory) {
-        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, 
threadFactory);
+        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, 
threadFactory, new RejectHandler());
     }
 
     public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long 
keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
-        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
+        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, 
new RejectHandler());
     }
 
     @Override
@@ -63,11 +66,54 @@
         return activeCount.get();
     }
     
+    /**
+     * [EMAIL PROTECTED]
+     */
+    @Override
+    public void execute(Runnable command) {
+        execute(command,0,TimeUnit.MILLISECONDS);
+    }
+    
+    /**
+     * Executes the given command at some time in the future.  The command
+     * may execute in a new thread, in a pooled thread, or in the calling
+     * thread, at the discretion of the <tt>Executor</tt> implementation.
+     * If no threads are available, it will be added to the work queue.
+     * If the work queue is full, the system will wait for the specified 
+     * time and it throw a RejectedExecutionException if the queue is still 
full after that.
+     *
+     * @param command the runnable task
+     * @throws RejectedExecutionException if this task cannot be
+     * accepted for execution - the queue is full
+     * @throws NullPointerException if command or unit is null
+     */
     public void execute(Runnable command, long timeout, TimeUnit unit) {
+        try {
+            super.execute(command);
+        } catch (RejectedExecutionException rx) {
+            if (super.getQueue() instanceof TaskQueue) {
+                TaskQueue queue = (TaskQueue)super.getQueue();
+                try {
+                    if (!queue.force(command, timeout, unit)) {
+                        throw new RejectedExecutionException("Queue capacity 
is full.");
+                    }
+                } catch (InterruptedException x) {
+                    Thread.currentThread().interrupted();
+                    throw new RejectedExecutionException(x);
+                }
+            } else {
+                throw rx;
+            }
+            
+        }
+    }
+    
+    static class RejectHandler implements 
java.util.concurrent.RejectedExecutionHandler {
+        public void rejectedExecution(Runnable r, 
java.util.concurrent.ThreadPoolExecutor executor) {
+            throw new RejectedExecutionException();
+        }
         
     }
-    
-    
 
     
     



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to