Thread: Transformar de sleep() para wait()

Ola pessoal, olhem o codigo abaixo, nele uma thread dorme por um tempo, mas eu queria transformar de sleep para wait() com notify(), porém quando faço isso tem a exceção de monitor ilegal, alguém poderia fazer um refactoring se possível para isso?

Brigaduuuuuuuuuu

// By: Adilson Bonan <arbonan@gmail.com>
// CounterHits.java

public class CounterHits extends Thread {
	public static int i = 10;
	private boolean monitor;

	// Métodos para atualizar a variável.
	public static synchronized int inc() { return ++i; }
	public static synchronized int dec() { return --i; }

	public void compute() { 
		System.out.println("Valor inicial de i : "+this.i+"\n");
		for (int i=0; i&lt3; i++) {

			try{
				sleep((int)(Math.random()*100));
			} catch (InterruptedException e1) {}


			if (getName().equals("Zezinho")){
				System.out.println(i+" "+getName()+" : "+CounterHits.inc());
			}
			if (getName().equals("Luizinho")){
				System.out.println(i+" "+getName()+" : "+CounterHits.dec());
			}
		}
		System.out.println("\nValor final de i : "+i);
		//notify() ou notifyAll();
		
	}

	// Executa a thread.
	public void run(){
		compute();
	}

	public static void main(String[] args) 
	{

		// Objetos thread.
		CounterHits ch1 = new CounterHits(); // Thread-0
		CounterHits ch2 = new CounterHits(); // Thread-1

		// Inicia a thread.
		ch1.start();ch1.setName("Zezinho");
		ch2.start();ch2.setName("Luizinho");

	}
}// Fim do programa.

Todo wait e notify devem estar dentro de um bloco sincronizado.

Declare o seu método como synchronized ou faça:

Random r = new Random(); synchronized (this) { try { sleep((int)(t.nextInt(100)+1); //Cuidado com 0 o wait espera para sempre } catch (InterruptedException e1) {} }

Só um comentário…

Para que você quer trocar o código para um wait?
Alguma outra thread, externa vai dar o notify(), por exemplo, para parar a computação?

Por favor, dê uma lida e baixe o exemplo deste tópico e veja se é isso mesmo que você quer.

Ola ViniGodoy, cara é o seguinte, eu quero mostrar essas duas threads ch1.start() e ch2.start() brigando para ++i e --i mas queria mostrar que nao tem como aumentar e diminuir ao mesmo tempo… entende…

Otra koisa… tire o sincronismo dos métodos inc() e dec() e coloquei no compute() e agora to com esse erro:

# javac CounterHits.java
CounterHits.java:12: <identifier> expected
        public void synchronized compute() {
                    ^
CounterHits.java:50: '(' expected
}// Fim do programa.
^
2 errors

O synchronized vem antes do tipo.

public synchronized void compute()

Eu estava pensando em seu problema.

Ainda sim, você não tem a necessidade do wait e notify.

Outra coisa, se você tem 2 objetos (cada um gerenciando seu próprio compute) e 2 threads, não haverá sentido em fazer a sincronização.

Threads não são objetos. Elas são linhas de execução que percorrem objetos. Para ter sentido a sincronização, duas threads devem tentar rodar o método compute da mesma instância, ou seja, de um só objeto.

Nesse caso, você teria que ter um objeto com o método compute e duas threads tentanto executa-lo ao mesmo tempo. É mais ou menos o que acontece com o objeto bloqPrinter, nesse exemplo que fiz para o Camilo. Esse exemplo também é interessante porque se você retirar a palavra sincronized do método, verá as threads acessando o objeto ao mesmo tempo.

Putzzz, deculpa ae pela distração, sabe como é né…compilei e o resultado foi o seguinte:

# java CounterHits
Valor inicial de i : 10

Valor inicial de i : 10

0 Zezinho : 11
0 Luizinho : 10
1 Luizinho : 9
2 Luizinho : 8

Valor final de i : 8
1 Zezinho : 9
2 Zezinho : 10

Valor final de i : 10

…é praticamente a mesma coisa que como sleep(), mas posso dizer verdadeiramente que isso ai ta em sincronismo?

Aki as duas threads estao quebrando o pau pra ++i e --i, porém o resultado final é sempre 10…

O wait() nunca será zero porque eu tenho incremento de 1 nele, veja lá…

Vou fazer mais um modelo, agora com threads externas… depois te mando…

Cara, brigaduuuuuuuuuuu

Eu recomendo que você dê uma boa lida nos links que eu deixei aí em cima. Eu dei explicações detalhadas sobre cada um desses assuntos, com exemplos e tudo mais.

Se depois, você ainda tiver dúvida, dá um toque.

Aproveita e dá uma lida também nessa discussão que onde descrevo exatamente o que aconteceu quando você rodou seu programa.

Falae, cara dei uma lida nos links q vc me passou, to quase la… he hehe, é que algumas vezes a abstração leva 1 poko mais de tempo…

Muito bom as explicações… mas veja que threads não é bem assim pra gente pegar…