Интерфейс Future<V>
- Параметры типа:
V— тип результата, возвращаемого методомgetэтого Future
- Все известные подинтерфейсы:
RunnableFuture<V>, RunnableScheduledFuture<V>, ScheduledFuture<V>
- Все известные реализующие классы:
CompletableFuture, CountedCompleter, ForkJoinTask, FutureTask, RecursiveAction, RecursiveTask, SwingWorker
public interface Future<V>
Future представляет результат асинхронного вычисления. Предоставляются методы для проверки завершения вычисления, ожидания его завершения и получения его результата. Результат можно получить только с помощью метода get после завершения вычисления; при необходимости метод блокирует выполнение, пока результат не будет готов. Отмена выполняется методом cancel. Предоставляются дополнительные методы для определения того, завершилась ли задача нормально или была отменена. После завершения вычисления его нельзя отменить. Если вы хотите использовать Future для возможности отмены, но не предоставлять доступный результат, можно объявить типы вида Future<?> и возвращать null в качестве результата базовой задачи. Отмена Future не обязательно приводит к немедленному прекращению вычисления. Метод cancel заставляет isCancelled() возвращать true, если он ещё не isDone(); в любом случае впоследствии isDone() сообщает true. Это предотвращает выполнение задачи в ExecutorService, если оно ещё не началось. Существует несколько способов предотвратить ненужные вычисления или разблокировать выполняющийся Future, который не выдаст результат. Если тела задач просты и коротки, специальных мер не требуется. Вычислительные методы в телах кода, учитывающих Future (например, ForkJoinTask, FutureTask), могут проверять собственный статус isDone() до начала или во время дорогостоящих вычислений. В контекстах блокирующего ввода-вывода или взаимодействия аргумент mayInterruptIfRunning метода
cancel можно использовать для поддержки соглашений, согласно которым задачи должны разблокироваться и завершаться при Thread.interrupted, независимо от того, проверяется ли это внутри тела задачи или в ответ на InterruptedException. По возможности всё же предпочтительно дополнительно проверять статус isDone(), чтобы избежать непреднамеренных последствий других применений Thread.interrupt().
Пример использования (обратите внимание, что приведённые ниже классы вымышлены.)
interface ArchiveSearcher { String search(String target); }
class App {
ExecutorService executor = ...;
ArchiveSearcher searcher = ...;
void showSearch(String target) throws InterruptedException {
Callable<String> task = () -> searcher.search(target);
Future<String> future = executor.submit(task);
displayOtherThings(); // do other things while searching
try {
displayText(future.get()); // use future
} catch (ExecutionException ex) { cleanup(); return; }
}
} Класс FutureTask является реализацией Future, которая реализует Runnable, поэтому её можно выполнить с помощью Executor. Например, приведённую выше конструкцию с submit можно заменить на: FutureTask<String> future = new FutureTask<>(task);
executor.execute(future); Эффекты согласованности памяти: действия, выполняемые асинхронным вычислением, происходят до действий, следующих за соответствующим Future.get() в другом потоке.
- Начиная с версии:
- 1.5
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Интерфейс | Описание |
|---|---|---|
static enum |
Future.State |
Представляет состояние вычисления. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
cancel |
Пытается отменить выполнение этой задачи. |
default Throwable |
exceptionNow() |
Возвращает исключение, выброшенное задачей, не дожидаясь её завершения. |
V |
get() |
При необходимости ожидает завершения вычисления, а затем получает его результат. |
V |
get |
При необходимости ожидает завершения вычисления не дольше указанного времени, а затем получает его результат, если он доступен. |
boolean |
isCancelled() |
Возвращает true, если эта задача была отменена до нормального завершения. |
boolean |
isDone() |
Возвращает true, если эта задача завершилась. |
default V |
resultNow() |
Возвращает вычисленный результат, не дожидаясь завершения. |
default Future.State |
state() |
Возвращает состояние вычисления. |
Подробное описание методов
cancel
boolean cancel(boolean mayInterruptIfRunning)
cancel, задача не должна запускаться. Если выполнение задачи уже началось, параметр mayInterruptIfRunning определяет, следует ли прервать поток, выполняющий эту задачу (если реализация может его определить), чтобы попытаться остановить задачу. Возвращаемое этим методом значение не обязательно указывает на то, что задача теперь отменена; используйте isCancelled().
- Параметры:
-
mayInterruptIfRunning—true, если следует прервать поток, выполняющий эту задачу (если реализация может определить этот поток); в противном случае выполняющимся задачам разрешается завершиться - Возвращает:
-
false, если задачу не удалось отменить, обычно потому, что она уже завершилась; в противном случае —true. Если два или более потока пытаются отменить задачу, по крайней мере один из них возвращаетtrue. Реализации могут предоставлять более строгие гарантии.
isCancelled
boolean isCancelled()
true, если эта задача была отменена до нормального завершения.- Возвращает:
-
true, если эта задача была отменена до завершения
isDone
boolean isDone()
true, если эта задача завершилась. Завершение может быть нормальным, произойти из-за исключения или отмены — во всех этих случаях этот метод возвращает true.- Возвращает:
-
true, если эта задача завершилась
get
V get() throws InterruptedException, ExecutionException
- Возвращает:
- вычисленный результат
- Выбрасывает:
-
CancellationException— если вычисление было отменено -
ExecutionException— если при вычислении было выброшено исключение -
InterruptedException— если текущий поток был прерван во время ожидания
get
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
- Параметры:
-
timeout— максимальное время ожидания -
unit— единица измерения времени для аргумента тайм-аута - Возвращает:
- вычисленный результат
- Выбрасывает:
-
CancellationException— если вычисление было отменено -
ExecutionException— если при вычислении было выброшено исключение -
InterruptedException— если текущий поток был прерван во время ожидания -
TimeoutException— если время ожидания истекло
resultNow
default V resultNow()
Этот метод предназначен для случаев, когда вызывающий код знает, что задача уже успешно завершилась, например, при фильтрации потока объектов Future для отбора успешно завершившихся задач и использовании операции отображения для получения потока результатов.
results = futures.stream()
.filter(f -> f.state() == Future.State.SUCCESS)
.map(Future::resultNow)
.toList();
- Требования к реализации:
- Реализация по умолчанию вызывает
isDone(), чтобы проверить, завершилась ли задача. Если она завершена, вызываетсяget()для получения результата. - Возвращает:
- вычисленный результат
- Выбрасывает:
-
IllegalStateException— если задача не завершилась или завершилась без результата - Начиная с версии:
- 19
exceptionNow
default Throwable exceptionNow()
Этот метод предназначен для случаев, когда вызывающий код знает, что задача уже завершилась с исключением.
- Требования к реализации:
- Реализация по умолчанию вызывает
isDone(), чтобы проверить, завершилась ли задача. Если она завершена и не отменена, вызываетсяget(), а исключениеExecutionExceptionперехватывается для получения исключения. - Возвращает:
- исключение, выброшенное задачей
- Выбрасывает:
-
IllegalStateException— если задача не завершилась, завершилась нормально или была отменена - Начиная с версии:
- 19
state
default Future.State state()
- Требования к реализации:
- Реализация по умолчанию использует
isDone(),isCancelled()иget()для определения состояния. - Возвращает:
- состояние вычисления
- Начиная с версии:
- 19
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.