Sincronizando threads

Seque o código:

public class Waiting implements Runnable { boolean flag = false; public static void main(String[] args) { Waiting w = new Waiting(); new Thread(w).start(); new Thread(w).start(); } public void run() { if (flag) { flag = false; System.out.print("1 "); try { wait(); } catch (Exception e) { } System.out.print("2 "); } else { flag = true; System.out.print("3 "); try { Thread.sleep(2000); } catch (Exception e) { } System.out.print("4 "); notify(); } } }
Por que ao chamar o método notify() lança esta exceção.

[quote]3 1 2 4 Exception in thread “Thread-1” java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.notify(Native Method)
at capitulo09.definindoInstanciandoIniciando.Waiting.run(Waiting.java:29)
at java.lang.Thread.run(Unknown Source)[/quote]
Alguém poderia me explicar ?

Você não pode dar nem wait() nem notify() fora de um método/bloco sincronizado

Até ai tudo bem, isto eu sei.
Mas porque o código roda o wait() e na hora que vai executar o método notify() lança a exceção ?

[quote=Heider Matos]Até ai tudo bem, isto eu sei.
Mas porque o código roda o wait() e na hora que vai executar o método notify() lança a exceção ?[/quote]

Isso está ocorrendo pq seu wait() está dentro do bloco do try, já o notify() está fora, portanto se haver o erro durante o notify não haverá o catch para tratar este erro, pois vc colocou o notify fora do bloco do try.

lembre-se que o catch ele trata… uma exeção que for acontecer em try{} e vc colocou o wait dentro do try{} se der merda ai ele vai para o catch que pode tratar o tipo de exeção mais kd o notify() do wait() que voce criou la no try{} por isso a exeção eh lançada parceiro resumindo eh o q renan_java falou…

Valeu galera… não tinha percebido este detalhe…
Fuiiiiiiiii…

pode ir pode irrrrrrrrrrr… mais obrigado :smiley: