Problema com Threads

Tenho uma Thread a

Thread a = new Thread(new Runnable() {
@Override
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() {
@Override
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

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?

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.

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.
3 curtidas

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.