Duvida thread [RESOLVIDO]

7 respostas
CarlosEduardoDantas
class MyThread extends Thread {
	String sa;
	
	public MyThread(String sa) {
		this.sa = sa;
	}
	
	public void run() {
		synchronized(sa) {
			while (!sa.equals("done")) {
				try {
					sa.wait();					
				} catch(InterruptedException e) {
					
				}
			}
		}
		System.out.println(sa);
	}
}

public class ThreadDoida {
	private static String sa = new String("Not Done");
	public static void main(String args[]) {
	    Thread t1 = new MyThread(sa);
	    t1.start();
	    synchronized(sa) {
	    	sa = new String("done");
	    	sa.notify();
	    }
	}
}

este codigo lança uma exceção IllegalMonitorStateException …

como que eu consertaria esse codigo para nao gerar essa exceção?

7 Respostas

LPJava

observe que os objetos são diferentes na sincronização… um é da instancia e outro é static… um nao bloqueia o outro…
Bom essa questao é do whizlabs eu errei… mais a melhor pessoa que eu conheço aqui no forum que daria uma boa aula disso ai é o vinny, hehe… bora ver se ele posta… ai… quero aprender :smiley:

CarlosEduardoDantas

LPJava:
observe que os objetos são diferentes na sincronização… um é da instancia e outro é static… um nao bloqueia o outro…
Bom essa questao é do whizlabs eu errei… mais a melhor pessoa que eu conheço aqui no forum que daria uma boa aula disso ai é o vinny, hehe… bora ver se ele posta… ai… quero aprender :D

obrigado, mas essa resposta sua o whizlabs ja respondeu pra mim… queria saber como corrigir… e outra coisa… não tem nada a ver ser static ou não… .se tu tirar o static, e criar a instancia no main(), o resultado é o mesmo.

mas d qq forma obrigado

LPJava

é rpz… realmente nao. eu errei essa questao… sei que os objetos de bloqueio sao diferentes… fiquei de ler hj a explicacao do whizlabs…

R
private static String sa = new String("Not Done");
...
synchronized(sa) {  
   sa = new String("done");  
   sa.notify();  
}

Teoria básica antes: Para chamar wait() ou notify() em um objeto é preciso obter o bloqueio do mesmo (através do uso de synchronized).

No código acima, você obteu o bloqueio do objeto sa = new String(“Not Done”);

Mas está tentando chamar notify() no objeto criado dentro do bloco… sa = new String(“done”); (o qual você não possui o lock) e, por isso, está sendo lançada IllegalMonitorStateException.

Provavelmente, pra evitar essa exceção, basta sincronizar o segundo objeto criado dentro do bloco synchronized (ou apenas comentar a linha de criação).

synchronized(sa) {  //pega bloqueio do "sa" static pra confundir na questão
   sa = new String("done");  
   synchronized(sa) { //pega bloqueio do sa recém-instanciado
      sa.notify();  
   }
}

// ou

synchronized(sa) {  //pega bloqueio do "sa" static
   //sa = new String("done");  não instancia um novo objeto
   sa.notify(); //chama notify() naquele objeto referenciado por "sa", do qual já possui o bloqueio
   }
}

[]'s

LPJava

hum foi o que falei… antes… pegadinha… ai… qdo eu respondi ela pela primeira vez… nao me liguei e marquei errado… e depois que aprendi e lembrei da regra… boa RAfafel :smiley:

CarlosEduardoDantas

muito obrigado rafael…

tirou todas as minhas duvidas… obrigado :wink:

ViniGodoy

LPJava:
observe que os objetos são diferentes na sincronização… um é da instancia e outro é static… um nao bloqueia o outro…
Bom essa questao é do whizlabs eu errei… mais a melhor pessoa que eu conheço aqui no forum que daria uma boa aula disso ai é o vinny, hehe… bora ver se ele posta… ai… quero aprender :D

Não vi tópico a tempo. Mas esse, na minha opinião, é mais um exemplo de como não se trabalhar com threads.

Criado 28 de outubro de 2007
Ultima resposta 19 de mar. de 2009
Respostas 7
Participantes 4