This shouldn't be a problem, you can safely ignore that fact that the threads are around. The number of threads will not increase, although I haven't tested it, they are just the basic ones that Java uses to pump messages to and from the platforms UI system. I think you will, ironically enough, only even notice this problem when testing the code from the command line. :-) G. Diwakar Mantha wrote: > Thanks, Gerard. It gives me an excellent idea as to the root cause of the > problem. > > So, given that I am using JDK 1.2.2, is there any workaround? > System.exit(0) will not work for me, because that will kill my servlet > container (I am using the transcoder from a servlet). > > I will try to check and see if these unused threads are accumulating after > each transcoding request. > > Thanks, > > --Diwakar > > -----Original Message----- > From: Gerard.Davison [mailto:[EMAIL PROTECTED]] > Sent: Monday, June 04, 2001 5:13 AM > To: Batik Users > Subject: Re: Lingering threads > > Hi, > > ASAIK the problem rests with the way Java interacts with it UI subsystem. > For example > when you perform any operation that involve AWT, this presumable includes > using any > Font object, all of the event pump threads start up. This is unavoidable > until JDK 1.4 > where it is possible to get a 'headless' version of AWT. (IE one that > doesn't need to > talk to a window manager) > > So why does this cause your program to not terminate? In previous version > of Java > these threads where marked daemon which meant that Java would not consider > them > significant when deciding whether to end the VM. (The VM will exit when > there are no > non daemon threads running) But for one reason or another, I cannot > remember what, the > AWT threads are now marked a non-daemon. This means that any program that > involves the > UI in anyway needs to call System.exit(0) explicitly in order for the > program to > finish. You just need to add this to the end of your code. > > Sorry if this is all gibberish, its monday morning here. :-) > > G. > > Diwakar Mantha wrote: > > > Hi, > > > > Firstly, thanks for all the answers to my previous questions on this > list. > > I have been able to use the transcoder to generate JPEGs from SVG on the > fly > > in a webserver, and my boss is quite pleased :-) Special thanks to Batik > > dev team for a wonderful product. > > > > I observe that some thread (s) do not finish after the transcoding is > done. > > Is this a bug? Or should I be doing some cleanup/setting after > transcoding? > > I suspect that this lingering thread (s) is causing my web server to > freeze > > up after several transcoding requests. I instantiate a single > > JPEGTranscoder object to serve all requests, and when a request comes in, > I > > simply send in suitable new input and output streams to the transcoder. > The > > first few times (10 or 20), it works fine, after that the images fail to > > download, and then the web server (JRun) freezes up completely. > > > > I have a simple, straightforward Java program below, that converts an SVG > > string to a JPEG file. When I run it from the command line, it does > > terminate after printing "DONE". Why? I have generated a stack trace > > (below), but am not experienced enough to interpret it. > > > > As always, thanks in advance for any suggestions. > > > > --Diwakar > > > > ================== Stack Trace ======================== > > > > SIGQUIT > > > > Full thread dump Classic VM (JDK-1.2.2_006, green threads): > > "Thread-1" (TID:0xebc735e0, sys_thread_t:0x79e358, state:CW) prio=5 > > at java.lang.Object.wait(Native Method) > > at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java, > Compiled Code) > > at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java, > Compiled Code) > > at > org.apache.batik.ext.awt.image.rendered.TileMap$1.run(TileMap.java, > > Compiled Code) > > "Thread-0" (TID:0xebc9e808, sys_thread_t:0x5f7150, state:CW) prio=5 > > at java.lang.Object.wait(Native Method) > > at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java, > Compiled Code) > > at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java, > Compiled Code) > > at > org.apache.batik.util.SoftReferenceCache$1.run(SoftReferenceCache.java, > > Compiled Code) > > "AWT-Motif" (TID:0xebcc17d8, sys_thread_t:0x4bd258, state:CW) prio=5 > > at sun.awt.motif.MToolkit.run(Native Method) > > at java.lang.Thread.run(Thread.java, Compiled Code) > > "SunToolkit.PostEventQueue-0" (TID:0xebcc2288, sys_thread_t:0x49b728, > > state:CW) prio=5 > > at java.lang.Object.wait(Native Method) > > at java.lang.Object.wait(Object.java, Compiled Code) > > at sun.awt.PostEventQueue.run(SunToolkit.java, Compiled Code) > > "AWT-EventQueue-0" (TID:0xebcc2600, sys_thread_t:0x49ad10, state:CW) > > prio=6 > > at java.lang.Object.wait(Native Method) > > at java.lang.Object.wait(Object.java, Compiled Code) > > at java.awt.EventQueue.getNextEvent(EventQueue.java, Compiled > Code) > > at > > > java.awt.EventDispatchThread.pumpOneEventForComponent(EventDispatchThread.ja > > > va, Compiled Code) > > at > > > java.awt.EventDispatchThread.pumpEventsForComponent(EventDispatchThread.java > > > , Compiled Code) > > at > java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java, > > Compiled Code) > > at java.awt.EventDispatchThread.run(EventDispatchThread.java, > Compiled > > Code) > > "Finalizer" (TID:0xebc98320, sys_thread_t:0x6d060, state:CW) prio=8 > > at java.lang.Object.wait(Native Method) > > at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java, > Compiled Code) > > at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java, > Compiled Code) > > at > java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:174) > > "Reference Handler" (TID:0xebc983b0, sys_thread_t:0x68ca0, state:CW) > > prio=10 > > at java.lang.Object.wait(Native Method) > > at java.lang.Object.wait(Object.java, Compiled Code) > > at > java.lang.ref.Reference$ReferenceHandler.run(Reference.java:114) > > "Signal dispatcher" (TID:0xebc983e0, sys_thread_t:0x63cf0, state:R) > > prio=5 > > "Thread-2" (TID:0xebcbdaa8, sys_thread_t:0x26dd8, state:CW) prio=5 > > Monitor Cache Dump: > > java.lang.ref.ReferenceQueue$Lock@EBC735D0/EBF4FEB8: <unowned> > > Waiting to be notified: > > "Thread-1" (0x79e358) > > java.lang.ref.ReferenceQueue$Lock@EBC98338/EBCCDD50: <unowned> > > Waiting to be notified: > > "Finalizer" (0x6d060) > > sun.awt.PostEventQueue@EBCC2288/EBDD5AB0: <unowned> > > Waiting to be notified: > > "SunToolkit.PostEventQueue-0" (0x49b728) > > java.awt.EventQueue@EBCC2650/EBDB6468: <unowned> > > Waiting to be notified: > > "AWT-EventQueue-0" (0x49ad10) > > java.lang.ref.Reference$Lock@EBC983C0/EBCCD890: <unowned> > > Waiting to be notified: > > "Reference Handler" (0x68ca0) > > java.lang.ref.ReferenceQueue$Lock@EBC9E7F8/EBDFE898: <unowned> > > Waiting to be notified: > > "Thread-0" (0x5f7150) > > Registered Monitor Dump: > > PCMap lock: <unowned> > > utf8 hash table: <unowned> > > JNI pinning lock: <unowned> > > JNI global reference lock: <unowned> > > BinClass lock: <unowned> > > Class linking lock: <unowned> > > System class loader lock: <unowned> > > Code rewrite lock: <unowned> > > Heap lock: <unowned> > > Monitor cache lock: owner "Signal dispatcher" (0x63cf0) 1 entry > > Dynamic loading lock: <unowned> > > Monitor IO lock: <unowned> > > User signal monitor: <unowned> > > Child death monitor: <unowned> > > I/O monitor: <unowned> > > Waiting to be notified: > > "AWT-Motif" (0x4bd258) > > Alarm monitor: <unowned> > > Waiting to be notified: > > <unknown thread> (0x2c0c8) > > Thread queue lock: owner "Signal dispatcher" (0x63cf0) 1 entry > > Waiting to be notified: > > "Thread-2" (0x26dd8) > > Monitor registry: owner "Signal dispatcher" (0x63cf0) 1 entry > > > > ================== Program Output ===================== > > > > 1. Creating ImageTranscoder... > > Font specified in font.properties not found [-urw-itc > > zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific] > > <More such Font errors deleted here> > > 2. Creating OutputStream... > > 3. Creating InputStream... > > 4. Creating TranscoderInput/Output... > > 5. Transcoding... > > ERROR: The JPEG quality has not been specified. Use the default one: no > > compression > > 6. Closing input and output streams... > > 7. !!! DONE !!! > > > > ================== Program Source ===================== > > > > import java.io.*; > > import org.apache.batik.transcoder.TranscoderException; > > import org.apache.batik.transcoder.TranscoderInput; > > import org.apache.batik.transcoder.TranscoderOutput; > > import org.apache.batik.transcoder.image.ImageTranscoder; > > import org.apache.batik.transcoder.image.JPEGTranscoder; > > > > public class th { > > > > public static void main (String args[]) { > > > > System.out.println("1. Creating ImageTranscoder..."); > > ImageTranscoder t = new JPEGTranscoder(); > > > > System.out.println("2. Creating OutputStream..."); > > FileOutputStream fos = null; > > try { > > fos = new FileOutputStream("jj.jpeg"); > > } catch (FileNotFoundException e) { > > System.out.println("Error in th: " + e); > > } > > OutputStream os = new BufferedOutputStream (fos); > > > > System.out.println("3. Creating InputStream..."); > > String sv = "<svg width=\"50\" height=\"40\"><rect x=\"0\" y=\"0\" > > width=\"10\" height=\"30\"/></svg>"; > > StringReader is = new StringReader(sv); > > > > System.out.println("4. Creating TranscoderInput/Output..."); > > TranscoderInput ti = new TranscoderInput(is); > > TranscoderOutput to = new TranscoderOutput(os); > > > > System.out.println("5. Transcoding..."); > > try { > > t.transcode(ti, to); > > } catch (TranscoderException e) { > > System.out.println("Error in th: " + e); > > } > > > > System.out.println("6. Closing input and output streams..."); > > try {is.close(); os.flush(); os.close();} catch (IOException e) > > {System.out.println("Error in th: " + e); } > > > > System.out.println("7. !!! DONE !!!"); > > } > > } > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > -- > > I don't cause bugs, the surrounding code just fails to adapt quickly > enough. > [EMAIL PROTECTED] > > (See attached file: Gerard.Davison.vcf) > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > (See attached file: Gerard.Davison.vcf) > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] -- I don't cause bugs, the surrounding code just fails to adapt quickly enough. [EMAIL PROTECTED]
begin:vcard n:Davison;Gerard x-mozilla-html:FALSE org:Oracle;JDeveloper adr:;;;;;; version:2.1 email;internet:[EMAIL PROTECTED] title:Senior Software Engineer fn:Gerard Davison end:vcard
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
