Java Tips: Tempo máximo de execução de uma tarefa

O código abaixo pode ser usado para caso queria que determinada tarefa dure no máximo um determinado tempo. Você determina um timeout para a execução de uma determinada tarefa. Útil por exemplo, caso tenha um processo que depende de outros processos externos. Pode acontecer desse processo externo demore muito para responder, dessa maneira, sua aplicação pode ficar parada por muito tempo e prejudicar o usuário. Nesse cenário é interessante determinar um timeout para nosso processo.

A solução utiliza a classe FutureTask que permite chamadas assíncronas que podem ser canceladas, verificar se uma computação foi completada, obter o resultado de uma computação ou utilizar o método get para bloquear a computação.

Código exemplo:

import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ExecutionTimeout {
       
    public static void main (String[] args) throws InterruptedException {
        FutureTask<?> theTask = null;
        try {
            // cria uma nova tarefa
            theTask = new FutureTask<Object>(new Runnable() {
                public void run() {
                    while(true) {
                        // código do seu processo
                        if (Thread.interrupted()) return;
                    }
                }
            }, null);
            
            // inicia a tarefa em uma nova thread
            new Thread(theTask).start();
            
            // bloquear a tarefa caso ultrapassar 10 segundos
            theTask.get(10L, TimeUnit.SECONDS); 
        }   
        catch (TimeoutException e) {
             // cai aqui caso ultrapassar os 10 segundos           
            System.out.println("Processo ultrapassou os 10 segundos");
            
            // parar o processo caso desejado
            theTask.cancel(true);
            
            // ou sair da aplcacação
            //System.exit(1);
            
        } catch (Exception ee) { }
    }
}
Please follow and like us:

Follow

Get every new post on this blog delivered to your Inbox.

Join other followers: