Juergen,

Thanx! Now I get it...either synchronized(this) OR data.notifyAll()/data.wait().

I had my monitors mixed up :)

Now if there was only a way to get that thread dump...not for THIS problem, but it 
might
come in handy sometime.

-Mario.

Juergen Kreileder wrote:

> >>>>> Mario Camou writes:
>
>     Mario> Juergen Kreileder wrote:
>
>     >> >>>>> Mario Camou writes:
>     >>
>     Mario> Hi,
>     Mario> I'm having some problems with threads, so I need to do a
>     Mario> thread dump (same thing that Ctrl-\ does) but from within
>     Mario> the program (i.e., I catch an Exception and want to do a
>     Mario> thread dump that moment). Does anyone here know how to do
>     Mario> that?
>     >>
>     >> You can get a partial stack trace with Thread.dumpStack, or Throwable's
>     >> printStackTrace method.
>
>     Mario> Oh, I know about those. I'm not interested in the stack
>     Mario> trace, I need the *Thread* dump. To see what I mean, hit
>     Mario> <Ctrl>-\ (that's ctrl+backslash) in the TTY from which
>     Mario> you're running a Java application.
>
> Yep, I know what you mean but AFAIK this is the only threads information
> you can get with API calls.
>
>     Mario> That's basically what I'm doing. The strange thing...I
>     Mario> tried to change "synchronized (data)" to "synchronized
>     Mario> (this)" and it magically started working.
>
>     Mario> public class Foo {
>     Mario>   private Vector data;
>
>     Mario>   public Vector getData() {
>     Mario>     if (data == null) {
>     Mario>       return null;
>     Mario>     }
>     Mario>     synchronized (data) {
>     Mario>       while (status != LOADED) {
>     Mario>         try {
>     Mario>           wait();
>
> Yes, that is 'this.wait()' and you're not the owner of this' monitor.
> (You're only the owner of data's monitor). To get this' monitor you'll
> have to use synchronized (this) or a synchronized method.
>
>     Mario>         } catch (InterruptedException ex) {}
>     Mario>       }
>     Mario>     status = IDLE;
>     Mario>     return data;
>     Mario>   }
>
>     Mario>   public void loadData() {
>     Mario>     data = new Vector();
>     Mario>     synchronized (data) {
>     Mario>       try {
>     Mario>         while (something) {
>     Mario>           SomeObject obj;
>     Mario>           // blah blah blah (create object obj and load data into it)
>     Mario>           data.addElement (obj);
>     Mario>         } finally {
>     Mario>           notifyAll();
>
> ditto
>
>     Mario>         }
>     Mario>       }
>     Mario>     }
>     Mario>   }
>     Mario> }  // If braces don't match up, I probably added too many or too few in 
>this
>     Mario> code snippet!
>
>         Juergen

Reply via email to