publicclassThread30extendsThread{publicvoidrestart(){startMe();}publicvoidstartMe(){synchronized(this){notifyAll();System.out.println("Trying To Notify");}}publicvoidrun(){try{synchronized(this){wait();System.out.println("Notified");}}catch(InterruptedExceptione){}}publicstaticvoidmain(String[]args){Thread30t1=newThread30();t1.start();t1.restart();}}
O resultado foi: Trying To Notify
E o programa não finalizou a sua execução.
A minha pergunta é… Sempre o resultado vai ser ser este?
Ou é possível também exibir Notified???
Se o bloco sincronizado do startMe começar primeiro, dá “Trying To Notify” e a outra Thread fica travada para sempre no wait.
Se o bloco sincronizado do run começar primeiro, dá “Trying To Notify” e “Notified” e o programa termina.
wagnerlegiao
Creio que tenha faltado notificar o objeto t1...
synchronized(t1){
t1.notify();
}
victorwss
wagnerlegiao:
Creio que tenha faltado notificar o objeto t1...
synchronized(t1){
t1.notify();
}
Observe que é synchronized (this) e nós temos um notifyAll. Portanto não faltou nada não.
Exercícios de certificação são bem confusos mesmo. :lol:
diegobrandao
Obrigado victorws,
Esse é o código original desta questão.
Com o static nenhuma dúvida quanto a não compilar…
publicstaticvoidstartMe(){synchronized(this){notifyAll();System.out.println("Trying To Notify");}}
No geral ta BEM complicado o Whizlabs…
sergiolopes
diego, nao sei se entendi essa ultima msg, mas com o static ai nao compila, certo?
nao existe “this” dentro de metodo estatico…
victorwss
Sergio Lopes:
diego, nao sei se entendi essa ultima msg, mas com o static ai nao compila, certo?
nao existe “this” dentro de metodo estatico…
Exatamente isso que ele quis dizer (pelo menos é o que entendi). Com o static fica fácil: “Code fails to compile”.
diegobrandao
Foi isso mesmo que eu quis dizer… com o static fica fácil…
C
cadu.sousa
publicclassThread30extendsThread{publicvoidrestart(){startMe();}publicvoidstartMe(){synchronized(this){//notifyAll(); <--comentadoSystem.out.println("Trying To Notify");}}publicvoidrun(){try{synchronized(this){//wait(); <-- comentadoSystem.out.println("Notified");}}catch(Exceptione){}//mudei a excecao InterruptedException }publicstaticvoidmain(String[]args){Thread30t1=newThread30();t1.start();t1.restart();}}
Olá , pessoal comentei wait e notifyAll, se a referencia t1 chama primeiro start() que chama run(), porque a primeira saída e “Trying To Notify” ?
E quando uso o debug a primeira saída é “Notified” ?
victorwss
cadu.sousa:
…
Olá , pessoal comentei wait e notifyAll, se a referencia t1 chama primeiro start() que chama run(), porque a primeira saída e “Trying To Notify” ?
E quando uso o debug a primeira saída é “Notified” ?
Neste caso os dois serão impressos, mas a ordem é indefinida. Pode ser que “Trying To Notify” venha primeiro ou pode ser que “Notified” venha primeiro. Isso daí é uma condição de corrida, duas Threads correm ao mesmo tempo e qualquer uma pode chegar no System.out primeiro.
C
cadu.sousa
Victor,
“Pode ser que “Trying To Notify” venha primeiro ou pode ser que “Notified” venha primeiro”
Certo até pensei nisso, mas me explica uma coisa, como assim duas Threads ? só existe uma referencia a classe que estende a Thread e sim dois
blocos synchronized, um pertencente a run(), e outro a startMe(), nao entendi o que vc quis dizer com duas Threads …
Obrigado.
victorwss
cadu.sousa:
Victor,
“Pode ser que “Trying To Notify” venha primeiro ou pode ser que “Notified” venha primeiro”
Certo até pensei nisso, mas me explica uma coisa, como assim duas Threads ? só existe uma referencia a classe que estende a Thread e sim dois
blocos synchronized, um pertencente a run(), e outro a startMe(), nao entendi o que vc quis dizer com duas Threads …
Obrigado.
Há duas threads, a primeira é a thread principal criada pela JVM e a segunda é a thread t1, criada pela thread principal.
gRoOve
Fiz alguns testes pra forçar a execução da Thread-1 primeiro, de forma que permita o funcionamento do wait()/notifyAll. Porém o método sleep() não funcionou no Thread.sleep() 2, alguém sabe por que isso ocorre? Os outros dois(1 e 3) funcionaram da forma esperada, resultando na saída: “Trying to notify. Notified.”
publicclassExercicioWaitextendsThread{publicvoidrestart()throwsInterruptedException{// 1 Thread.sleep(1000);startMe();}publicvoidstartMe()throwsInterruptedException{synchronized(this){// 2 Thread.sleep(1000);notifyAll();System.out.println("Trying to notify.");}}publicvoidrun(){try{synchronized(this){wait();System.out.println("Notified.");}}catch(InterruptedExceptione){}}publicstaticvoidmain(String[]args)throwsInterruptedException{ExercicioWaitexercicio=newExercicioWait();exercicio.start();// 3 Thread.sleep(1000); exercicio.restart();}}