Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #3869
| 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> |
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 | Next — Previous in thread | Next in thread | Find similar
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