On Sep 6, 2013, at 10:06 AM, Sean Luke wrote:

> I think a better approach would be to use the thread pool rather than keeping the threads static like this.  But it'll take a while to whip it up.
> 
> Sean
> 
> On Sep 6, 2013, at 9:43 AM, Ralf Buschermöhle wrote:
> 
>> Hi,
>> 
>> A little ... more elegant & less performance consuming solution was to change writeLoop() and return 'false' when waitOnMonitor returns one (receiving an interrupt):
>> 
>> boolean writeLoop()
>>       {
>>       Job job = null;
>> 
>>       try
>>           {
>>           synchronized(jobs)
>>               {
>>               // check for an unsent job
>>               if ((job = oldestUnsentJob()) == null)  // automatically marks as sent
>>                   {
>>                   // failed -- wait and drop out of the loop and come in again
>>                   debug("" + Thread.currentThread().getName() + "Waiting for a job to send" );
>>                   if (!slaveMonitor.waitOnMonitor(jobs))							// changed
>>                   	return false;										// new
>>                   }
>>   ...
>> 
>> Avoiding a busy waiting ... writer.isInterrupted ... of the previous version.
>> 
>> 	Ralf
>> 
>> On Sep 6, 2013, at 14:41, Ralf Buschermöhle <[log in to unmask]> wrote:
>> 
>>> Hi,
>>> 
>>> I added "!writer.isInterrupted()" to stop the (write)loop and now the threads are stopped.
>>> 
>>> In context "SlaveConnection.java"
>>> 
>>> writer = new Thread()
>>>          {
>>>          public void run()
>>>              {
>>>              while( !writer.isInterrupted() )
>>>              	writeLoop();
>>>              }
>>>          };
>>> 
>>> Greetings,
>>> 
>>> 	Ralf
>>> 
>>> On Sep 6, 2013, at 11:59, Ralf Buschermöhle <[log in to unmask]> wrote:
>>> 
>>>> Hi,
>>>> 
>>>> unfortunately adding memory does not solve the problem. 
>>>> 
>>>> It does not seem to be heap related ... I jstacked after 56 slaves, after 500 adding and removing (also waited for the disconnect messages) slaves and after the next 500 I received the Exception.
>>>> 
>>>> And the number of threads did not reduce after waiting.
>>>> 
>>>> I attached the thread dumps.
>>>> 
>>>> It's the slaveMonitor ... who does not receive an interrupt?
>>>> 
>>>> public boolean waitOnMonitor(Object monitor)
>>>>     {
>>>>     try
>>>>         {
>>>>         monitor.wait();
>>>>         }
>>>>     catch (InterruptedException e) { return false; }
>>>>     return true;
>>>>     }
>>>> 
>>>> Greetings,
>>>> 
>>>> 	Ralf
>>>> 
>>>> 
>>>> <56.stack><56+-500.stack><Exception.stack>
>>>> 
>>>> 
>>> 
>>