Greetings,

	Ralf

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