从计算中检索值 - 可调用
如果你的计算产生一些后来需要的返回值,则一个简单的 Runnable 任务是不够的。对于这种情况,你可以使用 ExecutorService.submit(
Callable
<T>)
,它在执行完成后返回一个值。
服务将返回 Future
,你可以使用它来检索任务执行的结果。
// Submit a callable for execution
ExecutorService pool = anExecutorService;
Future<Integer> future = pool.submit(new Callable<Integer>() {
@Override public Integer call() {
//do some computation
return new Random().nextInt();
}
});
// ... perform other tasks while future is executed in a different thread
当你需要获得未来的结果时,请致电 future.get()
-
无限期等待将来结果。
try { // Blocks current thread until future is completed Integer result = future.get(); catch (InterruptedException || ExecutionException e) { // handle appropriately }
-
等待将来完成,但不要超过指定的时间。
try { // Blocks current thread for a maximum of 500 milliseconds. // If the future finishes before that, result is returned, // otherwise TimeoutException is thrown. Integer result = future.get(500, TimeUnit.MILLISECONDS); catch (InterruptedException || ExecutionException || TimeoutException e) { // handle appropriately }
如果不再需要计划或运行任务的结果,你可以调用 Future.cancel(boolean)
取消它。
- 调用
cancel(false)
只会从要运行的任务队列中删除任务。 - 调用
cancel(true)
会也中断的任务,如果它当前正在运行。