Dúvida Thread - wait() e notify()

12 respostas
diegobrandao

Boa tarde a todos,

public class Thread30 extends Thread{
	public void restart(){
		startMe();
	}

	public  void startMe() {
		synchronized (this) {
				notifyAll();
				System.out.println("Trying To Notify");				
		}
	}
	public void run(){
		try{
			synchronized (this) {
				wait();
				System.out.println("Notified");
			}
		}catch(InterruptedException e){	}
	}
	public static void main(String[] args){
		Thread30 t1 = new Thread30();
		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???

Desde já agradeço a ajuda…

12 Respostas

victorwss

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…

public static void startMe() {   
        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
public class Thread30 extends Thread{   
    public void restart(){   
        startMe();   
    }   
  
    public  void startMe() {   
        synchronized (this) {   
                //notifyAll();   <--comentado
                System.out.println("Trying To Notify");               
        }   
    }   
    public void run(){   
        try{   
            synchronized (this) {   
                //wait();   <-- comentado
                System.out.println("Notified");   
            }   
        }catch(Exception e){ }   //mudei a excecao InterruptedException 
    }   
    public static void main(String[] args){   
        Thread30 t1 = new Thread30();   
        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

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.”

public class ExercicioWait extends Thread  {

	public void restart() throws InterruptedException  {
		// 1 Thread.sleep(1000);
		startMe();
	}

	public void startMe() throws InterruptedException  {
		synchronized(this){
			// 2 Thread.sleep(1000);
			notifyAll();
			System.out.println("Trying to notify.");
		}
	}

	public void run(){
		try {
			synchronized(this){				
				wait();
				System.out.println("Notified.");
			}
		} catch (InterruptedException e) {}
	}

	public static void main (String[] args) throws InterruptedException {
		ExercicioWait exercicio = new ExercicioWait();
		exercicio.start();
		// 3 Thread.sleep(1000);	
		exercicio.restart();
	}
}
Criado 6 de novembro de 2008
Ultima resposta 25 de jul. de 2011
Respostas 12
Participantes 6