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 <[email removido]>// CounterHits.javapublicclassCounterHitsextendsThread{publicstaticinti=10;privatebooleanmonitor;// Métodos para atualizar a variável.publicstaticsynchronizedintinc(){return++i;}publicstaticsynchronizedintdec(){return--i;}publicvoidcompute(){System.out.println("Valor inicial de i : "+this.i+"\n");for(inti=0;i<3;i++){try{sleep((int)(Math.random()*100));}catch(InterruptedExceptione1){}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.publicvoidrun(){compute();}publicstaticvoidmain(String[]args){// Objetos thread.CounterHitsch1=newCounterHits();// Thread-0CounterHitsch2=newCounterHits();// Thread-1// Inicia a thread.ch1.start();ch1.setName("Zezinho");ch2.start();ch2.setName("Luizinho");}}// Fim do programa.
Random r = new Random();
synchronized (this) {
try {
sleep((int)(t.nextInt(100)+1); //Cuidado com 0 o wait espera para sempre
} catch (InterruptedException e1) {}
}
ViniGodoy
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.
A
arbonan
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:
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.
A
arbonan
Putzzz, deculpa ae pela distração, sabe como é né…compilei e o resultado foi o seguinte:
…é 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
ViniGodoy
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.
ViniGodoy
Aproveita e dá uma lida também nessa discussão que onde descrevo exatamente o que aconteceu quando você rodou seu programa.
A
arbonan
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…