Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #3869

Re: streaming problem and thread freeze

From Daniele Futtorovic <da.futt.news@laposte-dot-net.invalid>
Newsgroups comp.lang.java.programmer
Subject Re: streaming problem and thread freeze
Date 2011-05-09 20:08 +0200
Organization A noiseless patient Spider
Message-ID <iq9ai7$t2s$1@dont-email.me> (permalink)
References <005a9e79-36fe-4bf1-aa1d-bda3a5aaebf2@glegroupsg2000goo.googlegroups.com>

Show all headers | View raw


On 09/05/2011 16:56, Fly allegedly wrote:
> Hello,
> I have a client program that read an XML from a STREAM every 60 seconds.
>  From the main Thread I do an infinite loop where I create a new working thread
> executing all the operations: read, parse, etc..
>
> This is what I do:
>
> <code>
>   DownloaderTask tempTask = null;
>
>          while (true) {
>
>              if (tempTask != null) {
>                  if (tempTask.isAlive()) {
>                      tempTask.cancel();
>                  }
>              }
>
>              tempTask = new DownloaderTask();
>
>              tempTask.start();
>
>              try {
>                  sleep(frequency * 1000);
>              } catch (InterruptedException ex) {
>                  log.severe("Main sleep failed");
>              }
>
>          }
>
> </code>
>
> Inside the Run method of the DownloaderTask, I first read from the Stream (a class field) with a BufferedReader, in this way:
>
> <code>
>   private String readDocumentFromStream(BufferedReader reader) throws IOException {
>              char[] buffer = new char[4 * 1024];
>              int charsRead = -1;
>              String retVal = "";
>              log.finer("---START reading XML ---");
>
>              while ((charsRead = reader.read(buffer, 0, 4 * 1024)) != -1)
>              {
>                  log.log(Level.FINER, "CharsRead: {0}", charsRead);
>                  retVal += String.copyValueOf(buffer, 0, charsRead);
>              }
>              log.finer("---STOP reading XML---");
>
>              return retVal;
>          }
> </code>
>
> In the DownloaderTask class I wrote a cancel() method, called by the main thread in the case the working thread was still alive after the sleep().
>
>
> It's definition:
>
> <code>
>     synchronized public void cancel() {
>
>              this.interrupt();
>              try {
>                  if (rd != null) {
>                      rd.close();
>                  }
>              } catch (IOException ex) {
>                  log.severe(ex.getMessage());
>              }
>
>              http_conn.disconnect();
>
>              log.log(Level.SEVERE, "Timeout. Thread {0} is being canceled and resource released.", this.getId());
>
>          }
> </code>
>
> My problems.
>
> Sometimes I see my program active, doing nothing, blocked probably in the read(), because if I check all logs, the last line written is "CharsRead: xxx" and no more.
> Here I post one of my saved log (where the read buffer was 1024 bytes):
>
> <LOG>
> ||-- 2011-05-03 06:44:59 FINE: Updating events data... --||
> ||-- 2011-05-03 06:44:59 FINE: Events updated! --||
> ||-- 2011-05-03 06:44:59 INFO: Release date: 2011-05-03 06:45:15 | Received: 187 Inserted: 0 Updated: 0 Deleted: 0 ||| Errors: 2 --||
> ||-- 2011-05-03 06:44:59 FINER: Normal closing thread 1.723 --||
> ||-- 2011-05-03 06:44:59 FINER: Thread 1.723 Closing --||
> ||-- 2011-05-03 06:45:52 FINER: Thread 1.725 Opening --||
> ||-- 2011-05-03 06:45:52 FINE: Opening server connection to: mysite.com:80 --||
> ||-- 2011-05-03 06:46:19 FINE: Reading From Stream --||
> ||-- 2011-05-03 06:46:19 FINER: ---START reading XML --- --||
> ||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
> ||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
> ||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
> ||-- 2011-05-03 06:46:19 FINER: CharsRead: 929 --||
> ||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
> ||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
> ||-- 2011-05-03 06:46:19 FINER: CharsRead: 872 --||
> </LOG>
>
> I noticed another strange thing in this log, that is I can't see the Thread Id: 1724.
> Can you help me to find where I am wrong? In the logic or maybe in the syntax of the program?
>
> Thanks in advance,
> Flavio

A few things:

Firstly, dunno if this will help the problem, but your main loop ought 
to look something like this:

   DownloaderTask tempTask = null;
   for( Thread t = Thread.currentThread(); ! t.isInterrupted(); ){
     if (tempTask != null) {
       if (tempTask.isAlive()) {
         tempTask.cancel();
       }
     }

     tempTask = new DownloaderTask();
     tempTask.start();

     try {
       TimeUnit.SECONDS.sleep( frequency ); // ;)
     }
     catch (InterruptedException ex) {
       *t.interrupt();*
     }
   }

Always re-interrupt when you've caught an InterruptedException. The 
reason is that catching that exception *clears* the interrupted status.

You possibly might as well try a join() on the worker thread, BTW.

And have a look at java.util.concurrent.Executors.

Secondly, although it is only a minor thing and only my personal 
opinion, this:

   } catch (IOException ex) {
     log.severe(ex.getMessage());
   }

is a *very* bad idea. Log the full stack. The message is next to useless 
as soon as the code becomes a little complex.

HTH,
-- 
DF.
An escaped convict once said to me:
"Alcatraz is the place to be"

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

streaming problem and thread freeze Fly <flavio80@gmail.com> - 2011-05-09 07:56 -0700
  Re: streaming problem and thread freeze Daniele Futtorovic <da.futt.news@laposte-dot-net.invalid> - 2011-05-09 20:08 +0200
    Re: streaming problem and thread freeze Lawrence D'Oliveiro <ldo@geek-central.gen.new_zealand> - 2011-05-10 15:31 +1200
      Re: streaming problem and thread freeze markspace <-@.> - 2011-05-10 04:47 -0700
      Re: streaming problem and thread freeze Lew <noone@lewscanon.com> - 2011-05-10 08:52 -0400
      Re: streaming problem and thread freeze Daniele Futtorovic <da.futt.news@laposte-dot-net.invalid> - 2011-05-10 21:17 +0200
        Re: streaming problem and thread freeze Lew <noone@lewscanon.com> - 2011-05-10 17:26 -0400
          Re: streaming problem and thread freeze Daniele Futtorovic <da.futt.news@laposte-dot-net.invalid> - 2011-05-11 18:55 +0200
        Re: streaming problem and thread freeze Lawrence D'Oliveiro <ldo@geek-central.gen.new_zealand> - 2011-05-11 14:06 +1200
          Re: streaming problem and thread freeze Lew <noone@lewscanon.com> - 2011-05-11 09:02 -0400

csiph-web