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