Problema com Threads

4 respostas Resolvido
threadsnetbeansprogramaçãojava
ditocujogy

Tenho uma Thread a

Thread a = new Thread(new Runnable() {

<a class="mention" href="/u/override">@Override</a>

public void run() {

(…)

que espera o notify() de uma Thread b em um looping

()

do{

pcJoga(ligacao.pcJoga(), ligacao.getPecaPC());

synchronized(b){

try{

System.out.println(Aguardando b);

b.wait();

System.out.println(n aguardando b);

}catch(InterruptedException ie){}

}

pcJoga(ligacao.usuarioJoga(btnClicado), ligacao.getPecaUsuario());

}while(continuaJogo());

E essa Thread b deve notificar a Thread a apenas quando um botão for clicado

Thread b = new Thread(new Runnable() {

<a class="mention" href="/u/override">@Override</a>

public void run() {

synchronized(this){

notify();

}

}

});

Comando do botão:

private void btnA1ActionPerformed(java.awt.event.ActionEvent evt) {

setBtnClicado(0);

b.start();

}
private void btnB1ActionPerformed(java.awt.event.ActionEvent evt) {                                      
    setBtnClicado(1);
    b.start();
}

o problema é que são muitos botões e eu não posso usar b.start(); duas vezes, já tentei interromper a Thread b, usar b.run(), criar uma flag para ativar a Thread b. O problema é que eu não entendo de Threads então não consegui fazer funcionar, agradeço qualquer ajuda.

[]'s

4 Respostas

darlan_machado

Então perder umas 2 horinhas estudando sobre não é opção?
Cara, tem coisas que não funcionam, pelo simples fato de não sabermos como funcionam.

Algumas informações relevantes não estão aí no teu relato.
Qual o intuito da thread b notificar a thread a?
Qual o intuito do programa?

ditocujogy

Isso é para estabelecer uma comunicação entre o usuário e o código, existe um momento em que o código precisa esperar a ação do usuário (clicar o botão) para poder continuar.

A Thread a está em looping, quando aparece b.wait o looping para até que o usuário clique em um botão que vai comandar o start da Thread b (b.start()), então a Thread b notifica a Thread a para continuar o looping, o looping continua até chegar em b.wait de novo e o usuário tem que clicar em outro botão que vai iniciar a Thread b e fazer a mesma coisa (notify()) para que a thread a continue e fica assim até que a condição termine. Só que se eu utilizar o b.start() em dois ou mais botões, quando eu apertar o segundo botão vai dar esse erro:
java.lang.IllegalThreadStateException
a documentação diz que não é legal startar a mesma Thread duas vezes.

A minha dúvida é como eu faço a Thread b notificar a Thread a toda vez que b.wait() estiver ativado e o usuário clicar em um botão.

staroski
Solucao aceita

Não vejo necessidade de Thread nesse caso, é o típico caso de implementar o padrão de projeto Observer.

Imagina uma situação do mundo real: Pegar um Uber para ir até uma festa.

Com Thread:

  1. Tem um monte de motoristas de Uber na rua perguntando se você quer ir pra festa;
  2. Você escolhe um deles, responde que sim e embarca no carro;
  3. Aí você fica a viagem toda perguntando para o motorista se já chegaram na festa;
  4. Quando ele responde que sim, você paga e desembarca.

Com Observer:

  1. Você chama um Uber para ir até a festa e ele vem até você;
  2. Você embarca no carro;
  3. Quando o motorista chega no destino ele te avisa dizendo que chegaram;
  4. Você paga e desembarca.
ditocujogy

Oque eu fiz foi utilizar apenas a Thread a, e colocar o wait() com um tempo tipo 2000 milisec, preso em um bloco while de condição verdadeira para executar infinitamente, então quando eu clico no botão mudo a condição do while para false e a Thread volta a executar, na continuação da thread a condição vira true de novo e o ciclo continua até finalizar a aplicação.

Com certeza tem soluções melhores, essa idéia do observer vou tentar implementar. Obrigado pela ajuda.

Criado 14 de maio de 2019
Ultima resposta 15 de mai. de 2019
Respostas 4
Participantes 3