Ajuda pra usa o synchronized

6 respostas
maior_abandonado

galera… eu so meio inicante, e to precisando de uma ajuda aki… eu fiz uma Thread aqui, que vai loopa 15 vezes e da um wait, mais não ta dando certo…preciso da ajuda de vcs…

desse jeito da java.lang.IllegalMonitorStateException, copiei a mensagem ai em baixo:

Exception in thread "Thread-2" java.lang.IllegalMonitorStateException

at java.lang.Object.wait(Native Method)

at Janela.run(Janela.java:116)

at java.lang.Thread.run(Thread.java:619)
public void run(){
        
        while(true){ 
            for (int cont=0;cont&lt16;cont++){
                System.out.println("loop"+cont);
            ...
            }
            synchronized(this) {
                     try {
                         Thread.currentThread().wait(5000);  //       &lt&lt-----------   linha 116
                     } catch (InterruptedException ex) {}
             }
         }
}

eu tentei tb cria um metodo pra sincroniza o problema é que o wait nele nao ta funcionando direito…veja o codigo:

public void run(){
        while(true){ 
            for (int cont=0;cont&lt16;cont++){
                System.out.println("loop"+cont);
            ...
            }
            esperar();
        }
} 

synchronized public void esperar(){
    System.out.println("entro no metodo");
    //JOptionPane.showMessageDialog(null, "entro no metodo");
    try {
        esperando=true;
        t.wait(300000);//5 minutos
    } catch (Exception e) {

    }
}

synchronized public void voltar(){
        try {
            notifyAll();//voltar a thread
            esperando=false;
        } finally {
        }

}

//esse metodo é o chamado ao ser apertado o botão da minha interface grafica
public void acaoinicio1(ActionEvent e){
    if (esperando==true)
        voltar();    
    if (prencheu)
        para[1]=false;
    else
        JOptionPane.showMessageDialog(null, "Para iniciar os testes, insira algum valor no campo quantidade de perdas");
}

vejam a saida:

init:
deps-jar:
compile-single:
run-single:
loop0
loop1
loop2
loop3
loop4
loop5
loop6
loop7
loop8
loop9
loop10
loop11
loop12
loop13
loop14
loop15
entro no metodo
loop0
loop1
loop2
loop3
loop4
loop5
loop6
loop7
loop8
loop9
loop10
loop11
loop12
loop13
loop14
loop15
entro no metodo
loop0

a saida nao ta errada, o problema é que não ta correndo o tempo do wait pra seguir a thread e reloopa…e eu tb não apertei o botão…

alguem ai pode me ajudar???

6 Respostas

maior_abandonado

se fizer alguma diferença o codigo todo do meu loop… (acho q não, porem eu so meio iniciante)

for (int cont=0;cont<16;cont++){

                System.out.println("loop"+cont);
                for (int n=1;n<16;n++){
                        try{
                            nperdas=Integer.parseInt(qtdade.getText());
                            prencheu=true;
                        }catch(NumberFormatException e){


                            if (prencheu==true)
                                JOptionPane.showMessageDialog(null, "Não deixe o campo quantidade de perdas vazio !");

                                prencheu=false;

                                for (int x=1;x<16;x++){

                                    para[x]=true;
                                    resposta[x].setText("");

                                    for (int i=1;i<11;i++){
                                        parado[x]=0;
                                    }
                                    caiu[x]=false;

                                }

                        }
                        
                        if (para[n]==false){
                                //JOptionPane.showMessageDialog(null, "to enviano"+ip[1].getText() );
                                resp=exe.pinga(ip[n].getText());

                                resposta[n].setText(resp);

                                if (caiu[n]==false){

                                        if (!resp.equals("HOST DOWN")){

                                            parado[n]=0;

                                        }else {

                                            if (parado[n]>(nperdas-2)){

                                                caiu[n]=true;

                                                d.Erro(ip[n].getText(), ip_erro[1].getText(), ip_erro[2].getText(), ip_erro[3].getText());
                                                ip_caido[n]=ip[1].getText();
                                                parado[n]=10;

                                            }else{

                                                parado[n]++;
                                                //JOptionPane.showMessageDialog(null, "perdeu o "+parado[1]+" pacote");
                                            }
                                        }
                                }else{

                                    if (!resp.equals("HOST DOWN")){

                                        parado[n]--;

                                        if (parado[n]<6){

                                            caiu[n]=false;
                                            if (ip_caido[n].equals(ip[n].getText())){
                                                d.Volto(ip[n].getText(), ip_erro[1].getText(), ip_erro[2].getText(), ip_erro[3].getText());
                                            }    
                                        }
                                    }                               
                                }    

                        } 
                }
                try {
                    t.sleep(100);
                } catch (Exception ex) {}
            }
            esperar();
maior_abandonado

aeeeeeeeeeeeeeeeee

consegui… (é o segundo topico que isso acontece…)

resolvi meu problema, trocando

synchronized(this) { try { Thread.currentThread().wait(5000);//linha 116 } catch (InterruptedException ex) {} }

por

synchronized(this) { try { this.wait(5000);//linha 116 } catch (InterruptedException ex) {} }

foi resumindo só troca o Thread.currentThread() por this… mais… mais honestamente eu nao imagino qual seria a diferença… como falei so iniciante…

bom…se aguem precisar aproveitar o codigo ta ai…

ViniGodoy

Se a idéia era só dar um wait, então você pode usar o método
Thread.sleep(5000);

Esse método não precisa estar num bloco synchronized, mas também não acorda no caso de um notifyAll.

Outra coisa, vc está ignorando as InterruptedException. Isso não é uma boa prática. Organize seu código para que, no caso de uma InterruptedException, sua Thread saia do método run.

No mais, dá uma olhada nesses tópicos, que tem algumas das dúvidas mais comuns sobre threads já vistas por aqui:
http://www.guj.com.br/posts/list/53187.java
http://www.guj.com.br/posts/list/57781.java
http://www.guj.com.br/posts/list/52964.java#279083 (não esqueça de olhar a página 2)
http://www.guj.com.br/posts/list/57739.java

maior_abandonado

vlw o toque cara…

eu ja tinha pensado no sleep, não o apliquei pq quero justamente que o loop volte a executar caso seja apertado o botão…

assim… essa classe ai chama uma outra, eviando o endereço ip que tiver em uma JTextField e a otra classe pinga… é necessario fazer 15 vezes e esperar depois (eu botei 5 segundos como exemplo, seria 5 minutos, o q daria 300000), o caso é que se for apertado o botão, tem que pinga tudo denovo (pq ai o usuario quer saber akele momento, os outros automaticos é pra manter a monitoria dos server…

quanto ao exeption, eu ja dexei um Excepton geral mesmo só por avisa q deu erro… mais eu vo da uma olhada nisso sim…

valeu o toque kra… eu vo da uma olhada nesses topico sim…até pq eu so iniciante ainda … brigadao…

maior_abandonado

olhando os exemplos que vc mando…eu percebi q vc tava ignorando, e como em um dos exemplo la, eu posso dexa o loop infinito dentro de um try com catch (InterruptedException) para o loop…

eu tinha ignorado pois nunca usava as interrupção mais caso eu va implementa algo depois…

vlw o toque denovo kra…vlw hein… to mto grato

ViniGodoy

Beleza. :slight_smile:

Criado 6 de setembro de 2007
Ultima resposta 10 de set. de 2007
Respostas 6
Participantes 2