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