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
:
- Tem um monte de motoristas de Uber na rua perguntando se você quer ir pra festa;
- Você escolhe um deles, responde que sim e embarca no carro;
- Aí você fica a viagem toda perguntando para o motorista se já chegaram na festa;
- Quando ele responde que sim, você paga e desembarca.
Com Observer
:
- Você chama um Uber para ir até a festa e ele vem até você;
- Você embarca no carro;
- Quando o motorista chega no destino ele te avisa dizendo que chegaram;
- 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.