Java Future

本文翻译自http://tutorials.jenkov.com/java-util-concurrent/java-future.html,人工翻译,仅供学习交流。

Java Future

java.util.concurrent.Future类表示一个异步计算结果,创建异步任务时,将返回一个Java Future对象。Future对象作为异步任务结果的句柄。一旦异步任务完成,结果可以通过任务启动时返回的Future对象访问。
一些Java内置的并发工具类,比如Java ExecutorService,会从它们的一些方法返回一个Java Future对象。在ExecutorService的情况下,,当您提交一个Callable让它并发(异步)执行时,它将返回一个Future。

Java Future接口定义

为了理解Java Future接口如何工作,以下是接口定义的近似值:

public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning)
    V       get();
    V       get(long timeout, TimeUnit unit);
    boolean isCancelled();
    boolean isDone();
}

这些方法将在后面的章节中介绍——但是正如您所看到的,Java Future接口没有那么高级。

从Future中获得结果

如前所述,Java Future表示异步任务的结果。要获得结果,可以调用Future上的两个get()方法之一。get()方法都返回一个Object,但返回类型也可以是泛型类型(指特定类的对象,而不仅仅是object)。下面是一个通过Java Future的get()方法获取结果的例子:

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();
}

如果在异步任务完成之前调用get()方法,get()方法将阻塞,直到结果准备好。有一个可以通过方法参数指定在经过一段时间后超时的get()方法。下面是一个调用get()版本的例子:

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.
}

上面的例子等待结果在Future可用的最大时间为1000毫秒,如果在1000毫秒内没有可用的结果,则抛出TimeoutException。

Future cancel ()取消任务

可以通过Java Future实例调用Future cancel()方法取消异步任务。异步任务执行必须实现支持取消,如果没有这种支持,调用cancel()将不起作用。下面是一个通过Java Future cancel()方法取消任务的例子:

future.cancel();

检查任务是否完成

可以通过调用Future isDone来检查异步任务是否完成(并且有一个可用的结果)。下面是调用Java Future isDone()方法的示例:

Future future = ... // Get Future from somewhere

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

检查任务是否取消

可以检查由Java Future表示的异步任务是否被取消,可以通过调用Future isCancelled()方法来检查它。下面是一个检查任务是否被取消的例子:

Future future = ... // get Future from somewhere

if(future.isCancelled()) {

} else {

}
下一章:ThreadPoolExecutor
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值