I finally proposed a patch for trunk in 
https://issues.apache.org/bugzilla/show_bug.cgi?id=49159 for this. Thanks for 
reviewing it...

Sylvain

On 30 avr. 2010, at 18:27, Sylvain Laurent wrote:

> 
> 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