Pergunta

Estou apenas começando a procurar futuros e o ScheduleDexecutorService em Java, e estou me perguntando por que meu chamável não está sendo executado na programação que indiquei. Neste código de exemplo, o chamável é executado uma vez, mas o aplicativo nunca conclui, nem a tarefa é executada novamente, e é o que eu esperava acontecer (tenho certeza de que o problema está com a minha expectativa).

Runnables funcionam bem; Callables parecem bloquear para sempre, mas não sei por que ... o que estou perdendo?

Obrigado!

   public class ExecutorExample {

    /**
     * @param args
     * @throws ExecutionException 
     * @throws InterruptedException 
     */
    public static void main(String[] args) throws InterruptedException, ExecutionException {

        ScheduledExecutorService scheduler =  Executors.newScheduledThreadPool(5);

        FutureTask<ArrayList<String>> ft1 = new FutureTask<ArrayList<String>>(new Callable<ArrayList<String>>(){
            @Override
            public ArrayList<String> call() {
                ArrayList<String> stuff = new ArrayList<String>();
                for(int i = 0;i<10;i++){
                    String thing ="Adding " + i + " to result"; 
                    stuff.add(thing);
                    System.out.println(thing);

                }
                return stuff;
            }});

        scheduler.scheduleAtFixedRate(ft1, 0, 1, TimeUnit.SECONDS);

        System.out.println(ft1.get());
        System.out.println(ft1.isDone());

    }
}
Foi útil?

Solução

O problema é que FutureTask é usado e, como sua documentação de classe diz: "Depois que o cálculo é concluído, o cálculo não pode ser reiniciado ou cancelado".

Depois de run método de FutureTask foi invocado uma vez, as invocações subsequentes retornam imediatamente, sem delegar à tarefa Callable instância.

Apenas a Runnable Pode ser usado como uma tarefa recorrente, e isso não permite que transmitir um resultado. Em vez disso, dê o Runnable tarefa de um retorno de chamada que ele pode invocar no final de seu run Método, para relatar os resultados de cada execução da tarefa de volta aos ouvintes em outros threads.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top