[quote=Luiz Augusto Prado][quote=rdgo94]Olá a todos.
É o seguinte pessoal, estou com uma dúvida em relação a sincronização das Thread. Preciso que um método do “objeto A” aguarde o retorno de um método no “Objeto B”, mas dentro método do “Objeto B” eu preciso esperar que uma variável booleana fique false para ela poder retornar. Tipo:
//metodo do objetoA
public boolean action(){
return objetoB.verificarDados();
}
//verificarDados(); do objetoB
public synchronized boolean verificarDados(){
lock = true; //Indica que iniciou a verificação e aguarda.
while(lock){
}
return true;
}
Se eu fizer isto, o while ficará travando toda a execução (até mesmo do método de verificação). Embora que, essa variável lock ficará em um loop e a qualquer momento da execução ela ficará false, e quando ficar, o método verificarDados() irá retornar true.
Então, preciso que no momento que eu chamar o verificaDados(), este espere que a veriável lock fique false para ele poder retornar ao outro método.
Alguém poderia dar uma ajuda? Obrigado desde já.
[/quote]
[quote=rdgo94]Bom, utilizei o método join() para esperar o término da Thread.
Só que o problema é que se eu utilizar o join() ela irá pausar a execução das outras Threads…
[/quote]
Isso está correto.
synchronized garante que a thread só irá executar este codigo se ela estiver a posse do lock. Ou seja, as outras threads irão esperar a execução.
join:
http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html
vc poderia exemplificar melhor o que quer fazer e buscar entender o ciclo de vida de uma thread. Por que não posta um exemplo bem pequeno do que gostaria de fazer? Precisamos saber se vc está estendendo de thread ou runnable… Ver suas classes, mesmo que simples, ajudaria. coloco loops dentro do metodo run.
http://www.caelum.com.br/apostila-java-orientacao-objetos/programacao-concorrente-e-threads/
Dá uma olhada neste tutorial:
http://www.javabeginner.com/learn-java/java-threads-tutorial[/quote]
Olá, primeiramente obrigado pela resposta. Vou tentar explicar melhor a situação, não irei postar o código inteiro pois é muito grande, mas é seguinte:
O Projeto trabalha com frames e a cada frame novo (uma imagem da camera) é desencadeada uma nova Thread. Estou trabalhando com o OpenNI para sensores de profundidade.
Na classe Principal.java tenho métodos que implementam MouseListener, um deles é o mouseClicked que ao disparar um evento de clique ele vai até o objeto responsável por iniciar a calibração:
Principal.java
//...outros códigos
Monitor monitor = new Monitor();
@Override
public void mouseClicked(MouseEvent arg0) {
//Aqui estou usando o padrão State
if(monitor.acao(MenuOptions.CALIBRATE)){
System.out.println("CALIBRADO");
}
}
//...outros códigos
Lá na classe Monitor.java terá o método acao que instanciará um objeto conforme o Enum. Neste caso, para calibragem:
Monitor.java
public class Monitor{
//...outros codigos
@Override
public boolean acao(MonitorOptions option){
switch(option.getOption()){
case 1:
state = new StartMonitorState();
break;
case 2:
state = new PauseMonitorState();
break;
case 3:
state = new CalibrateMonitorState();
break;
default:
state = new StartMonitorState();
}
return state.startAction(this);
}
}
Calibragem.java
public class Calibragem implements MonitorState{
@Override
public synchronized boolean startAction() {
Thread t = new Thread(new Runnable({
@Override
public void run() {
ControllerFrame controllerF = ((ControllerFrame)interactionMonitor);
controllerF.startCalibrate();
}
});
t.start();
return true;
}
}
ControllerFrame.java
public class ControllerFrame{
private volatile boolean;
//..Outros códigos
public boolean startCalibrate(){
startCalibrate = true;
while(startCalibrate){ }
return true;
}
public synchronized void onNewFrame(){
//Aqui fica toda a parte do processamento de cada frame. Assim, quando ha um novo frame esse método é chamado desencadeando uma nova Thread. Isso é padrão do OpenNI.
}
//..Outros códigos
}
Então o que eu realmente preciso é:
Ao clicar ele desencadeie em sequencia: clique -> inicie a calibração e espere à terminar para depois poder retornar true. E depois que a calibração terminar ele apareça “CALIBRADO”.
Mas se eu der um join ou mesmo aquele while ele irá travar a execução, consequentemente os novos frames contendo as imagens ficará travada.