You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-users@xmlgraphics.apache.org by Diwakar Mantha <dm...@i2.com> on 2001/06/01 16:33:50 UTC

Lingering threads

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: batik-users-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-users-help@xml.apache.org


Re: Lingering threads

Posted by "Gerard.Davison" <Ge...@oracle.com>.
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:Gerard.Davison@oracle.com]
> 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: batik-users-unsubscribe@xml.apache.org
> > For additional commands, e-mail: batik-users-help@xml.apache.org
>
> --
>
>    I don't cause bugs, the surrounding code just fails to adapt quickly
> enough.
>    GMDavison@iee.org
>
> (See attached file: Gerard.Davison.vcf)
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: batik-users-unsubscribe@xml.apache.org
> For additional commands, e-mail: batik-users-help@xml.apache.org
> (See attached file: Gerard.Davison.vcf)
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: batik-users-unsubscribe@xml.apache.org
> For additional commands, e-mail: batik-users-help@xml.apache.org

--

   I don't cause bugs, the surrounding code just fails to adapt quickly enough.
   GMDavison@iee.org


RE: Lingering threads

Posted by Diwakar Mantha <dm...@i2.com>.
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:Gerard.Davison@oracle.com]
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: batik-users-unsubscribe@xml.apache.org
> For additional commands, e-mail: batik-users-help@xml.apache.org

--

   I don't cause bugs, the surrounding code just fails to adapt quickly
enough.
   GMDavison@iee.org


(See attached file: Gerard.Davison.vcf)
---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-users-help@xml.apache.org
(See attached file: Gerard.Davison.vcf)


---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-users-help@xml.apache.org


Re: Lingering threads

Posted by "Gerard.Davison" <Ge...@oracle.com>.
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: batik-users-unsubscribe@xml.apache.org
> For additional commands, e-mail: batik-users-help@xml.apache.org

--

   I don't cause bugs, the surrounding code just fails to adapt quickly enough.
   GMDavison@iee.org