O código é seguinte:
package Diagnotisc;
public class Questao64 extends Thread{
public void restart(){
startMe();
}
public static void startMe(){
synchronized (Questao64.class){
Questao64.class.notifyAll();
System.out.println("Trying to Notify");
}
}
public void run(){
try{
synchronized (this){
wait();
System.out.println("Nofified");
}
}catch (InterruptedException e){
}
}
public static void main (String args[]){
Questao64 q = new Questao64();
q.start();
q.restart();
}
}
Ele imprimirá apenas “Trying to Notify”.
Entao, eu gostaria de mudar este codigos para imprimir tambem “Nofified”. Modifiquei a linha " synchronized (this){" para “synchronized (Questao64.class){”. Mas lancara uma excecao IllegalMonitorStateException durante execução.
Alguem tem alguma ideia para arrumar estes codigos para imprimir “Nofified” e “Trying to Notify” sem lancar a exceção?
Grato
No método startMe:
public void startMe(){ // modificar de método de classe para método de instância retirando static
synchronized (this){ //bloquear no objeto corrente
notifyAll(); //chamar notifyAll do objeto corrente, para notificar todas as threads que aguardam pelo bloqueio desse objeto, nesse caso apenas uma está aguardando
System.out.println("Trying to Notify");
}
}
No método main:
public static void main (String args[]){
Questao64 q = new Questao64();
q.start();
try{
Thread.sleep(1);//colocar a thread main para dar uma dormidinha mínima, suficiente para a outra thread executar e chamar wait antes da chamada a notifyAll
}catch(InterruptedException e){
}
q.restart();
}
Essa é uma idéia, não sei se é a que vc esperava. De qualquer forma ela imprime as duas Strings e não lança exceção.
Ok… acho que vc precisa urgentemente reforçar a sua teoria sobre threads.
A “dormidinha” que o javadev colocou é interessante para demonstrar o conceito, mas também não pense que é bom basear um código multi-threaded nisso. Aqui vão alguns posts que podem te ajudar:
http://www.guj.com.br/posts/list/53187.java#279817
http://www.guj.com.br/posts/list/57781.java#303957
http://www.guj.com.br/posts/list/52481.java#276136
Qualquer coisa é só perguntar.