[Resolvido]Fazer Thread esperar eternamente com wait()

3 respostas
ribclauport

Bom pessoal, eu estava tentando ter o efeito de uma Thread esperar para sempre usando o método wait(), e não dando um notify() ou um notifyAll() no objeto "c", mas a após o termino da Thread Calculator mesmo sem notify() ou nofityAll(), as threads estão sendo "acordadas" normalmente, poderiam me
dizer onde estou errando? Lembrando que eu quero o efeito contrário ao ideal, ou seja quero que as Threads fiquem durmindo, realmente quer o "erro".

Segue abaixo o código

package br.com.thread.calculator;

public class Reader extends Thread {
	
	Calculator c;
	public Reader(Calculator calc,String nome){
		super(nome);
		c = calc;
	}
	@Override
	public void run(){
		synchronized(c){
			System.out.println("Waiting for calculation..."+Thread.currentThread().getName());
			try {
				c.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("Total is "+c.total);
		}
	}
	//***********************Main*****************************************
	public static void main(String[] args) {
		Calculator calculator = new Calculator();
		calculator.setPriority(MIN_PRIORITY);
		
		Reader r1 = new Reader(calculator,"Segmento 1");
		r1.start();
		
		Reader r2 = new Reader(calculator,"Segmento 2");
		r2.start();
		
		Reader r3 = new Reader(calculator,"Segmento 3");
		r3.start();
		
		calculator.start();
	}
}

class Calculator extends Thread{
	int total;
	@Override
	public void run(){
		synchronized(this){
			for(int i = 0; i < 10; i++){
				total +=i;
				System.out.println(i);
			}
		}
	}
}

Saída:

Waiting for calculation...Segmento 1 Waiting for calculation...Segmento 3 Waiting for calculation...Segmento 2 0 1 2 3 4 5 6 7 8 9 Total is 45 Total is 45 Total is 45

3 Respostas

ribclauport

Bom, eu tinha procurado bastante, mais acredito que não foi o suficiente, encontrei esse post com a resposta

ViniGodoy

Faltou também chamar notifyAll() após o seu for.

ribclauport

Vini, realmente eu não tinha usado o notifyAll e nem o notify, por que realmente queria que a thread ficasse durmindo eternamente…
E vi na sua resposta no post citado que realmente mesmo sem chamar notify ou notifyAll a thread pode ser “acordada” pelo agendador.

Obrigado.

Criado 22 de fevereiro de 2012
Ultima resposta 22 de fev. de 2012
Respostas 3
Participantes 2