slump wrote:
> Anyone can answer this?
> If I am wrong, please tell me 
>   
No time to check atm. Can you create a JIRA with your first message ? We
will process it later (mails get lost, when JIRA stay in our way...)

Thanks !
> Thanks
>
>
>
>
> slump
> 2008-09-28
>
>
>
> 发件人: slump
> 发送时间: 2008-09-04 17:30:35
> 收件人: dev
> 抄送: 
> 主题: race condition in OrderedThreadPoolExecutor/UnorderedThreadPoolExecutor
>
>
> I think I found a race condition in 
> OrderedThreadPoolExecutor/UnorderedThreadPoolExecutor
>
> I write a textline echo server using MINA
>
> I add a UnorderedThreadPoolExecutor in server's filter:
>
>  acceptor.getFilterChain().addLast("executor",
>             new ExecutorFilter(new UnorderedThreadPoolExecutor(10)));
>
>  and in messageReceived, I add sleep(3000) before echo the line received
>
> when I send 10 lines from client , I think the server should use 10 threads 
> to process 10 message concurrently
> but the server only use 2 thread or 4 thread , and the remain message must 
> wait until sleep complete
>
> I changed executor to  ThreadPoolExecutor in JDK, it will use 10 thread
>
> I checked and trace the code of  UnorderedThreadPoolExecutor, find the reason:
>    private void addWorkerIfNecessary() {
>         if (idleWorkers.get() == 0) {
>             synchronized (workers) {
>                 if (workers.isEmpty() || idleWorkers.get() == 0) {
>                     addWorker();
>                 }
>             }
>         }
>     }
>
> there may be some race condition:
> 1 thread A call executor's execute to sunmit one task
> 2 executor find there are no idle worker, so create a new thread and start 
> it, now idleWorkers is 1 
> 3 before new worker thread fetch task and decrement the idleWorkers, the 
> thread A submit more task
> 4 the executor find idleWorkers is 1 , so don't create new thread
> 5 the new worker thread fetch task and decrement the idleWorkers, now 
> idleWorkers is 0 ,but there are some task left in queue without worker
>
> MAYBE the   idleWorkers.get() == 0 should be change to idleWorkers.get()  < 
> getQueue().size() ?
>
> And in OrderedThreadPoolExecutor  , have the same race condition.
>
>
> And I have one more question: 
> Why not just use  ThreadPoolExecutor in JDK instead of  
> UnorderedThreadPoolExecutor? 
> does UnorderedThreadPoolExecutor have some special requirement which  
> ThreadPoolExecutor can't fulfil?
>        
>
>
>
> dingli
> 2008-09-04
>   


-- 
--
cordialement, regards,
Emmanuel Lécharny
www.iktek.com
directory.apache.org


Reply via email to