logo

Exemplo futuro de Java

Em Java , Futuro é um interface que pertence a java.util.concurrent pacote . É usado para representar o resultado de uma computação assíncrona. A interface fornece métodos para verificar se o cálculo foi concluído ou não, para aguardar sua conclusão e para recuperar o resultado do cálculo. Depois que a tarefa ou cálculo for concluído, não será possível cancelar o cálculo.

Sintaxe:

 public interface Future 

Exemplo de futuro Java

O melhor exemplo de Java Future é ExecutorService interface. Ele produz um objeto Future (de alguns de seus métodos) para rastrear o progresso de uma ou mais tarefas assíncronas.

Métodos da Interface do Futuro

A interface fornece os cinco métodos a seguir:

Método Descrição
cancelar() Tenta cancelar a execução da tarefa.
pegar() O método espera, se necessário, que o cálculo seja concluído e então recupera seu resultado.
pegar() Aguarda, se necessário, no máximo o tempo determinado para a conclusão do cálculo e, em seguida, recupera seu resultado, se disponível.
é cancelado() Retorna verdadeiro se a tarefa foi cancelada antes de sua conclusão.
é feito() Ele retorna verdadeiro se a tarefa for concluída.

Houve algumas deficiências na interface Future que são as seguintes:

  • Usando Future, o cálculo não pode ser concluído manualmente.
  • Não avisa quando a comutação é concluída.
  • Sua cadeia não pode ser criada e combinada.

Para superar as limitações acima, Java 8 introduzido CompletávelFuturo .

Usando Future em Programação Assíncrona

Obtendo Resultado

Como discutimos acima, o Futuro representa o resultado de uma tarefa assíncrona. Para recuperar o resultado dessa tarefa assíncrona, a interface Java Future fornece as duas versões a seguir dos métodos get(), ambas retornando um objeto. Observe que o tipo de retorno pode ser um tipo genérico. Por exemplo:

 Future future = ... // get Future by starting async task // do something else, until ready to check result via Future // get result from Future try { Object result = future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } 

Nota: Se tentarmos invocar o método get() antes que a tarefa assíncrona seja concluída, o método get() será bloqueado até que o resultado esteja pronto.

Para superar a deficiência acima, a interface Future fornece outra versão do método get() que exclui uma quantidade de tempo (em milissegundos) como parâmetro. Representa que o Futuro aguardará um certo tempo para concluir a tarefa após esse resultado estar disponível no Futuro. Por exemplo:

 try { Object result = future.get(1000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { } catch (ExecutionException e) { } catch (TimeoutException e) { // thrown if timeout time interval passes // before a result is available. } 

Se Future não obtiver nenhum resultado dentro do tempo especificado, um TimeoutException é lançada pelo Futuro.

Cancelar uma tarefa assíncrona

Também podemos cancelar uma tarefa assíncrona a qualquer momento chamando o método cancelar() método da interface Future. Por exemplo:

 Future future = ... // Get Future from somewhere future.cancel(); 

Verifique se uma tarefa assíncrona foi concluída

A interface fornece um método é feito() para verificar se a tarefa assíncrona foi concluída ou não. Por exemplo:

 Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else } 

Verifique se uma tarefa assíncrona foi cancelada

A interface Future fornece um método é cancelado() para verificar se a tarefa assíncrona representada por Future foi cancelada ou não. Ele retorna verdadeiro se a tarefa for cancelada com sucesso, caso contrário, retorna falso. Por exemplo:

 Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { } 

Exemplo de futuro Java

FutureExample.java

 import java.util.concurrent.*; public class FutureExample { public static void main(String args[]) throws InterruptedException, ExecutionException { //ExecutorService allows us to execute tasks on threads asynchronously ExecutorService es = Executors.newSingleThreadExecutor(); //getting future //the method submit() submits a value-returning task for execution and returns the Future Future future = es.submit(() -> { //sleep thread for 2 seconds Thread.sleep(2000); return 'Welcome to Javatpoint'; }); //checks if the task is completed or not while(!future.isDone()) { System.out.println('The task is still in process.....'); //sleep thread for 2 milliseconds Thread.sleep(200); } System.out.println('Task completed! getting the result'); //getting the result after completing the task String result = future.get(); //prints the result System.out.println(result); es.shutdown(); } } 

Saída:

Exemplo futuro de Java