# Java `Future`示例

> 原文： [https://javatutorial.net/java-future-example](https://javatutorial.net/java-future-example)

异步计算的结果称为`Future`，更具体地说，它具有此名称，因为它（结果）将在将来的中稍后的时间点完成。 创建异步任务后，将创建将来的对象。 提供了许多方法来帮助检索结果（使用`get`方法（这是唯一的检索方法）），使用`cancel`方法进行取消以及检查是否检查结果的方法。 任务成功完成或被取消。

![java-featured-image](img/e0db051dedc1179e7424b6d998a6a772.jpg)

`Future`的主要优点在于，它使我们能够同时执行其他进程，同时等待`Future`中嵌入的主要任务完成。 这意味着当我们面对大型计算时，使用`Future`是个好主意。

## 方法

1.  `boolean cancel(boolean mayInterruptIfRunning)`
2.  `V get()`
3.  `V get(long timeout, TimeUnit unit) `
    1.  这与上面的 get 方法不同，因为在此方法中，指定了超时作为等待条件
4.  `boolean isCancelled()`
5.  `boolean isDone()`

## 使用`get(timeout, unit)`的`Future`的基本实现

```java
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; 

public class FutureDemo 
{
    public static void main(String[] args) {
    	ExecutorService executorService = Executors.newSingleThreadExecutor();

    	Future<String> future = executorService.submit(() -> {
            Thread.sleep(5000);
            return "Done";
        });

        try {
            while(!future.isDone()) {
                System.out.println("Task completion in progress...");
                Thread.sleep(500);
            }

            System.out.println("Task completed!");
            String result = future.get(3000, TimeUnit.MILLISECONDS); // that's the future result
            System.out.println(result);

            executorService.shutdown();
        } 
        catch (InterruptedException e) {

        } 
        catch (ExecutionException e) {

        } 
        catch (TimeoutException e) { // this will be thrown if the task has not been completed within the specified time
        	future.cancel(true); //  if this task has not started when cancel is called, this task should never run
        	future.isDone(); // will return true  
        	future.isCancelled(); // will return true 
        }   
    }
}

```

## 输出：

```java
Task completion in progress...
Task completion in progress...
Task completion in progress...
Task completion in progress...
Task completion in progress...
Task completion in progress...
Task completion in progress...
Task completion in progress...
Task completion in progress...
Task completion in progress...
Task completed!
Done

```

## 细分

在`ExecutorService`上调用`commit()`方法，返回`Future`。 现在有了`Future`，我们可以调用上面的方法了。 但是，您应该特别注意的是，它在提交的任务正在“运行”时打印“正在完成任务…”。

如果任务没有在指定的时间内完成（如注释所示），将抛出`TimeoutException catch`。