[Resolvido] Duvida com thread

4 respostas
B
private void procurarJogada() throws InterruptedException {
        List<Jogada> l = tab.getPossiveis(pc);
        IaThreads aux = new IaThreads(tab, pc, null, jogadores);
        aux.limparAlfa();
        Thread threads = null;
        int a = 0;
        ExecutorService executar = Executors.newFixedThreadPool(20);
        for (Jogada jogada : l) {
            a++;
            aux = new IaThreads(tab, pc, jogada, 5);
            threads = new Thread(aux);
            executar.execute(threads);
            System.out.println("=======================================");
            System.out.println("executando treads: " + a);
            System.out.println("testando variante: " + jogada.nome(tab));
        }
        System.out.println("=======================================\n\n");
        Medida jogarPosicao;
        threads = new Thread("espera");
        ExecutorService threadExecutor = Executors.newFixedThreadPool(1);
        try {
            threads.sleep(30000);
            threadExecutor.execute(threads);

            if (threads.isInterrupted()) {
                System.exit(0);
            }
        } catch (InterruptedException ex) {
            System.out.println("treta na threads");
        }
        //espera 30 segundos para realizar a jogada;
        jogarPosicao = aux.getAlfa();
        if (jogarPosicao != null) {
            System.out.println("jogando: " + jogarPosicao.getJ().nome(tab) + " valor: " + jogarPosicao.getValor());
            tab.moverPeca(jogarPosicao.getJ().getPeca(), jogarPosicao.getJ());
            t.atualizar(tab);
            tab.setJogou(false);
        }
        System.out.println("Jogadas total = " + aux.getTotalJogadas());
    }

o problema é o seguinte, como eu faço para o programa espera finalizar a execução de todas as threads, ou após um tempo maximo continuar o programa?
da forma como esta ele sempre ira esperar 30 segundos para realizar uma jogada, mas muitas vezes o calculo ja é concluido bem antes, mas outras vezes é nessessario mais para executar todas as threads.
pesquisei sobre threads mas não achei nenhum comando que resolveria meu problema.

4 Respostas

ViniGodoy

Ao invés do método execute, use o método submit, aí você pode usar o Future retornado para esperar a thread através do método get():

private void procurarJogada() throws InterruptedException {
        List&lt;Jogada&gt; l = tab.getPossiveis(pc);
        List&lt;Future&gt; tasks = new ArrayList&lt;Future&gt;();
        IaThreads aux = new IaThreads(tab, pc, null, jogadores);
        aux.limparAlfa();
        int a = 0;
        ExecutorService executor = Executors.newFixedThreadPool(20);
        for (Jogada jogada : l) {
            a++;
            aux = new IaThreads(tab, pc, jogada, 5);
            tasks.add(executar.submit(aux, Object.class));
            System.out.println("=======================================");
            System.out.println("executando treads: " + a);
            System.out.println("testando variante: " + jogada.nome(tab));
        }
        System.out.println("=======================================\n\n");
        Medida jogarPosicao;
        threads = new Thread("espera");
        //Espera as threads processarem
        for (Future task : tasks) {
            task.get();
        }
        jogarPosicao = aux.getAlfa();
        if (jogarPosicao != null) {
            System.out.println("jogando: " + jogarPosicao.getJ().nome(tab) + " valor: " + jogarPosicao.getValor());
            tab.moverPeca(jogarPosicao.getJ().getPeca(), jogarPosicao.getJ());
            t.atualizar(tab);
            tab.setJogou(false);
        }
        System.out.println("Jogadas total = " + aux.getTotalJogadas());
    }
B

funcionou perfeitamente, ele executa a jogada assim que as threads são executadas, porem como eu faço para unir isso a um contador de tempo maximo?

por que em algumas situações ele ultrapassa os 3 milhões de variantes testada, calculando apenas 5 jogadas a frente, e como no começo era apenas para aprender a utilizar mais recursos da linguagem, não preocupei com desempenho, então agora seria util travar um tempo maximo em que ele pode ficar processando.

para não ultrapassar os 30 segundos por exemplo.

ViniGodoy

Isso você tem que incluir no while da sua IA:

//Tempo em ms antes de começar o while long time = System.currentTimeMillis(); while (System.currentTimeMillis() - time &lt; 10000) //10s { //Lógica da sua IA aqui. }

B

verdade… estava pensando em algo muito mais complexo que provavelmente não daria certo e esqueci da forma mais simples :smiley:

Criado 3 de março de 2013
Ultima resposta 3 de mar. de 2013
Respostas 4
Participantes 2