异步计算的结果称为Future
,更具体地说,它具有此名称,因为它(结果)将在将来的中稍后的时间点完成。 创建异步任务后,将创建将来的对象。 提供了许多方法来帮助检索结果(使用get
方法(这是唯一的检索方法)),使用cancel
方法进行取消以及检查是否检查结果的方法。 任务成功完成或被取消。
Future
的主要优点在于,它使我们能够同时执行其他进程,同时等待Future
中嵌入的主要任务完成。 这意味着当我们面对大型计算时,使用Future
是个好主意。
方法
boolean cancel(boolean mayInterruptIfRunning)
V get()
V get(long timeout, TimeUnit unit)
- 这与上面的 get 方法不同,因为在此方法中,指定了超时作为等待条件
boolean isCancelled()
boolean isDone()
使用get(timeout, unit)
的Future
的基本实现
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
}
}
}
输出:
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
。