On 30 avr. 2010, at 00:01, Pid wrote:
> 
> Are you saying that you want to stop processing requests each time a
> webapp gets restarted, or that the thread pool is refreshed by
> sequentially killing each thread and recreating it?

Something in between : I create a new pool with the same characteristics as the 
current one, make it the current pool so that new requests are served by the 
new pool, then cleanly shut the old pool down. When calling 
ThreadPoolExecutor.shutdown(), it gracefully terminates all threads in the pool 
after its associated TaskQueue is empty : Idle threads stop immediately (and 
not sequentially), busy threads continue processing their current request. If 
the TaskQueue is not empty, it means that there are no idle threads, and so 
busy threads will continue processing tasks in the queue until it becomes empty.

The renewThreads looks like (in StandardThreadExecutor) :

        public void renewThreads() {
                ThreadPoolExecutor oldExecutor;
                synchronized (executorLock) { // to avoid renewing threads 
concurrently
                        oldExecutor = executor;
                        ThreadPoolExecutor newExecutor=new 
ThreadPoolExecutor(getMinSpareThreads(),
                                        getMaxThreads(), maxIdleTime, 
TimeUnit.MILLISECONDS,
                                        taskqueue, 
oldExecutor.getThreadFactory());
                        
                        executor = newExecutor;
                        taskqueue.setParent(executor);
                }

                oldExecutor.shutdown();
                //we don't wait for termination of the old pool, threads will 
terminate when their work is done
        }

I marked StandardThreadExecutor.executor and TaskQueue.parent as volatile to 
propagate the change of executor instance to other threads without 
synchronizing threads.

An improvement I can do is to pre-start some "core" threads in the new pool 
before making it active. It would reduce the performance impact on the next few 
requests.

Sylvain



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to