Buscando clareza sobre Java ScheduledexecutorService e FutureTask
-
19-09-2019 - |
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());
}
}
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.