问题
Future
接口是什么
答案
Future接口
ExecutorService
接口的submit()
方法和invokeAll()
方法返回一个Future
对象或者Future
对象的集合,从Future
中可以获取到任务执行的结果或者获取到任务执行的状态(任务是运行中还是执行完成).
Future
接口提供了一个可能阻塞的get()
方法,返回Callable
任务的返回值,如果是Runnable
任务,将返回null.当任务还没有返回结果之前,调用get()
方法将会导致方法被阻塞,直到任务返回结果.
Future<String> future = executorService.submit(callableTask);
String result = null;
try {
result = future.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
get()
方法的长时间阻塞会导致一个应用的性能下降,如果任务的返回值并不重要,可以通过调用带timeout的方法来避免这种问题.
String result = future.get(200, TimeUnit.MILLISECONDS);
如果执行的时间比指定的时间来的长,将会抛出一个TimeoutException
异常,但任务还会继续执行,只是取消获取任务返回值的获取.
使用isDone()
方法可以检查任务是否已经执行完成.
使用cancel()
方法可以取消任务的执行(可能在执行途中被取消).使用isCancelled()
方法可以检查任务是否被取消.
boolean canceled = future.cancel(true);
boolean isCancelled = future.isCancelled();