Problema com thread

3 respostas
R

Pessoal, estou com o seguinte problema para um trabalho da faculdade.

Gira r1 = new Gira(jLFig1, arrayImagens, jCNivel.getSelectedIndex());
    Gira r2 = new Gira(jLFig2, arrayImagens, jCNivel.getSelectedIndex());
    Gira r3 = new Gira(jLFig3, arrayImagens, jCNivel.getSelectedIndex());
    Gira r4 = new Gira(jLFig4, arrayImagens, jCNivel.getSelectedIndex());
    Gira r5 = new Gira(jLFig5, arrayImagens, jCNivel.getSelectedIndex());
       
    r1.start();
    r2.start();
    r3.start();
    r4.start();
    r5.start();
    
    resultado(r1.getResultado(), r2.getResultado(), r3.getResultado(), r4.getResultado(), r5.getResultado());

As Threads funcionam perfeitamente, o problema ta na linha

resultado(r1.getResultado(), r2.getResultado(), r3.getResultado(), r4.getResultado(), r5.getResultado());

que deveria ser executada apos encerrar as threads r1 a r5 mas isso nao acontece, essa linha é executada antes e dai num funciona como devia.

Se alguem puder ajudar eu agradeço muito.

3 Respostas

B

Ola,

É, a execução normal nao vai esperar pelo termino da thread não… o que vc pode fazer é, passar uma referencia da classe que recebe o resultado para as threads e assim quando estas terminarem de fazer o que tem que fazer manda o resultado para esta “resultado”.

L

Ou então, se vc só pode executar o resultado quando todas threads tiverem terminado de executar, vc deve criar um mecanismo de “espera”, antes de mostrar os resultados todas threads devem terminar de executar.
Isso pode ser feito usando algumas classes do pacote java.util.concurrent (como por exemplo CyclicBarrier).

Qualquer coisa da uma lida nesse tutorial
http://argonavis1.locaweb.com.br/cursos/java/j100/tiger.html#j5-concurrent

L

Outra solução:

Classe Gira

class Gira implements Callable<Integer> {
  public Integer call() throws Exception {
    Thread.sleep(2000);
    return 1;
  }
}

Executando:

public static void main(String[] args) {
  ExecutorService e = Executors.newCachedThreadPool();
  Future<Integer> g1 = e.submit(new Gira());
  Future<Integer> g2 = e.submit(new Gira());

  resultado(g1.get(), g2.get());
}

static void resultado(int r1, int r2) {
  System.out.println(r1 + "," + r2);
}
Criado 26 de outubro de 2007
Ultima resposta 26 de out. de 2007
Respostas 3
Participantes 3