Implementando tempos limite com FutureTask

Às vezes, quando você está escrevendo algum código que precisa de comunicação com sistemas externos, não necessariamente usando um soquete, por exemplo, pode estar usando uma porta serial, podemos precisar de uma maneira de implementar um algoritmo de tempo limite, portanto, se após algum tempo especificado, o a solicitação não retorna um resultado, um erro de tempo limite deve ser lançado para que o usuário possa agir em conseqüência e não esperar indefinidamente por um resultado que talvez nunca chegue.

Se a API que está sendo usada contiver um método de leitura com tempo limite, o problema será facilmente corrigido ao capturar a exceção, mas se não, você deve implementar a lógica de tempo limite. Para fazer isso, podemos usar a classe FutureTask .

FutureTask<MyResult> timeoutTask = null;
try {
timeoutTask
= new FutureTask<MyResult>(new Callable<MyResult>() {

@Override
public MyResult call() throws Exception {
MyResult result = //expensive operation
return result;
}
});

new Thread(timeoutTask).start();
MyResult result = timeoutTask.get(5L, TimeUnit.SECONDS);
} catch (InterruptedException e) {

} catch (ExecutionException e) {

} catch (TimeoutException e) {

}

Basicamente, o que estamos fazendo é criar um objeto FutureTask e uma interface Callable que executa o método de chamada que requer um tempo limite. Em seguida, criamos um thread para executá-lo. E, finalmente, chamamos o método get, que retorna o resultado, ou se o tempo limite ultrapassar (neste caso 5 segundos), TimeoutException é lançado.

Portanto, vimos uma maneira realmente fácil de implementar um recurso de tempo limite para nosso aplicativo.