Dúvida thread

4 respostas
CarlosEduardoDantas

Galera… essa parte de notify() e wait() não está muito clara pra mim… nesse caso porque fica “Lendo dados de usuario” a vida toda?

package threads;

public class ManStrings {
	
	public static void main(String args[]) {
		Usuario u = new Usuario(1,"gravar arquivo");
		u.setName("usuario1");
		u.start();
		Maquina m = new Maquina(u);
		m.start();
	}
}

class Usuario extends Thread {
	
	private int codigo;
	private String operacao;
	
	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public String getOperacao() {
		return operacao;
	}

	public void setOperacao(String operacao) {
		this.operacao = operacao;
	}
	

	public Usuario(int codigo, String operacao) {
		super();
		this.codigo = codigo;
		this.operacao = operacao;
	}

	public void run() {
		synchronized(this) {
			while (true) {
				System.out.println(" Thread "+Thread.currentThread().getName()+" Lendo dados de usuario");
				try {
					Thread.sleep(3000);
					this.notifyAll();
				} catch(InterruptedException e) {
					System.out.println("Erro");
				}					
			}
		}	
	}
}

class Maquina extends Thread {
	private Usuario usuario;
		
	public Maquina(Usuario usuario) {
		super();
		this.usuario = usuario;
	}

	public void run() {
		
		synchronized(usuario) { 
		    while (true) {
		    	try {
		    		usuario.wait();		    		
		    	} catch(InterruptedException e) {
		    		System.out.println("Vai a merda");
		    	}	
		    	System.out.println(" Thread "+Thread.currentThread().getName()+ " Maquina trabalhando!");
		    }
		}   
	}
}

4 Respostas

R

Foi pq no run() de Maquina tinha uma expressão não permitida pela JVM:

hhehehehehe

Brincadeiras a parte…

O que está acontecendo é o seguinte:

A chamada a notifyAll não libera o bloqueio… apenas notifica as threads que estão esperando pelo bloqueio. Assim sendo, as outras threads só poderão pegar o bloqueio quando a thread que chamou notifyAll liberar o bloqueio… saindo do bloco sincronizado ou terminando o run().

Então, o que está acontecendo no seu código? o laço whie(true){} está dentro do bloco synchronyzed(this){}… com isso, a thread usuario nunca vai liberar o bloqueio do objeto Usuario.

Tente rodar o mesmo código trocando a ordem das instruções… ao invés de:

synchronyzed(this){
   while(true){
      ...
   }
}

coloque isso:

while(true){
   synchronyzed(this){
      ...
   }
}

Note que agora sim… após chamar o this.notifyAll(), além de notificar a thread maquina o código irá sair do bloco sincronizado, liberando o bloqueio, para fazer o teste do while… nesse meio tempo, se a thread maquina concorrer com a thread usuario ela conseguirá rodar seu run().

CarlosEduardoDantas

humm… entendi… entao nesse caso o wait(); … ia ficar esperando o cara liberar o bloqueio a vida toda… mas como o while estava dentro de syncronized, ficou o tempo todo bloqueado, nao liberando acesso…

obrigado cara :wink:

CarlosEduardoDantas

aproveitando sua bondade… vc que fez prova esses dias…

que nivel de thread tao cobrando na prova?

wandersonpo

complicado

Criado 5 de outubro de 2007
Ultima resposta 5 de out. de 2007
Respostas 4
Participantes 3