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