Subject: | |
From: | |
Reply To: | |
Date: | Fri, 6 Sep 2013 15:43:07 +0200 |
Content-Type: | multipart/signed |
Parts/Attachments: |
|
|
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>
>>
>>
>
|
|
|