持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
Future接口使用
Future类异步获取计算后的返回结果,该类中提供了检查是否计算完成、等待计算完成、获取计算结果的方法,其中通过get()方法能够在计算完成时完成时获取计算结果,通过调用cancel()方法可以取消任务的执行,其他方法用来判断这个任务是正常的还是已被取消。
注意点:
一旦计算完成,就不能取消任务。
实现代码如下:
public class FutureMain {
static class Searcher{
String search(String word){
return word +" World";
}
}
void showSearch(final String word) {
ExecutorService executorService = Executors.newCachedThreadPool();
Searcher searcher = new Searcher();
Future<String> future = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return searcher.search(word);
}
});
try {
// System.out.println(future.cancel(true));
System.out.println(future.get());
System.out.println(future.isDone());
System.out.println(future.isCancelled());
executorService.shutdown();
executorService.awaitTermination(1,TimeUnit.HOURS);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
FutureMain futureMain = new FutureMain();
futureMain.showSearch("Gxin");
}
}
运行结果如下:
Gxin World
true
false
如果将cancel方法设置为true,则线程发生CancellationException异常
运行结果如下:
true Exception in thread "main" java.util.concurrent.CancellationException at java.util.concurrent.FutureTask.report(FutureTask.java:121) at java.util.concurrent.FutureTask.get(FutureTask.java:192) at com.ozx.concurrentprogram.executor.controller.FutureMain.showSearch(FutureMain.java:31) at com.ozx.concurrentprogram.executor.controller.FutureMain.main(FutureMain.java:45)
get()方法用于异步获取计算返回结果,isDone()方法用于判断任务是否执行完成,isCancel()方法用于判断任务是否已经取消。
Promise接口使用
Future接口调用线程需要通过线程池或者由FutureTask类创建,而后需要主线程执行get方法以获取结果,然后再执行相应的动作,其实有一种方式能够在调用线程时无须通过Future.get()方法获取到结果,就能进一步执行的动作,而这些回调的动作由执行Future任务的线程在执行完Future后自动调用,那方式就是使用Promise接口。