Java – Como utilizar a FutureTask, controlando o timeout e status de uma thread

multithreadingFutureTask é uma implementação da interface Future a ser executada numa chamada em paralelo. Sendo possível cancelar a execução de uma tarefa, descobrir se a execução já terminou com sucesso ou erro, entre outras operações.

A FutureTask precisa de uma interface para a implementação de uma execução em paralelo. a Callable é parecida com a interface Runnable, mas esta não retorna nenhum valor, enquanto a Callable deve retornar um valor ao final da execução;

MÉTODOS DO FUTURE:

future.cancel(boolean mayInterruptIfRunning) : Cancela o processamento, passar true para interromper se ela ja está iniciada, ou false para cancelar se ainda nao foi iniciada.
future.get(long timeout, TimeUnit unit)  : Espera a resposta da execução de acordo com timeout.
future.get() : Espera a resposta da execução.
future.isDone() : Verifica se a execução já acabou.
future.isCancelled() : Verifica se o processamento foi cancelado.

Exemplo:

   public void sampleFutureTask(final int processamentoMillis, final Integer timeOutMillis) throws ExecutionException, InterruptedException, TimeoutException {
        FutureTask<String> futureTask = new FutureTask(() -> {
            try {
                Thread.sleep(processamentoMillis);//PROCESSAMENTO
                System.out.println(Thread.currentThread().getName() + " - finalizado");
            } catch (InterruptedException ex) {
            }
            return "retorno";
        });
        new Thread(futureTask, "futureTask").start();

        if (timeOutMillis == null) {
            while (!futureTask.isDone()) {
                System.out.println("Aguardando termino da execucao sem timeout...");
                Thread.sleep(100);
            }
            System.out.println("RET: " + futureTask.get());
        } else {
            System.out.println("Aguardando retorno...");
            try {
                String retorno = futureTask.get(timeOutMillis, TimeUnit.MILLISECONDS);
                System.out.println("RET: " + retorno);
            } catch (Exception e) {
                futureTask.cancel(true);
                throw e;
            }
        }
    }

Help DEV – Analista desenvolvedor Java / Android

http://helpdev.com.br/zarelli

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>