Ответ 1
Apache Commons Lang определяет аналогичную реализацию, которая называется ConstantFuture, вы можете получить ее, вызвав:
Future<T> future = ConcurrentUtils.constantFuture(T myValue);
Каков наилучший способ построения завершенного будущего на Java? Я выполнил свой собственный CompletedFuture
ниже, но надеялся, что что-то подобное уже существует.
public class CompletedFuture<T> implements Future<T> {
private final T result;
public CompletedFuture(final T result) {
this.result = result;
}
@Override
public boolean cancel(final boolean b) {
return false;
}
@Override
public boolean isCancelled() {
return false;
}
@Override
public boolean isDone() {
return true;
}
@Override
public T get() throws InterruptedException, ExecutionException {
return this.result;
}
@Override
public T get(final long l, final TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
return get();
}
}
Apache Commons Lang определяет аналогичную реализацию, которая называется ConstantFuture, вы можете получить ее, вызвав:
Future<T> future = ConcurrentUtils.constantFuture(T myValue);
В Java 8 вы можете использовать встроенный файл CompletableFuture:
Future future = CompletableFuture.completedFuture(value);
Гуава определяет Futures.immediateFuture(value)
, который выполняет эту работу.
FutureTask<String> ft = new FutureTask<>(() -> "foo");
ft.run();
System.out.println(ft.get());
выведет "foo";
У вас также может быть Future, который выдает исключение при вызове get():
FutureTask<String> ft = new FutureTask<>(() -> {throw new RuntimeException("exception!");});
ft.run();
Я нашел очень похожий класс для вашего в Java rt.jar
com.sun.xml.internal.ws.util.CompletedFuture
Он также позволяет указать исключение, которое может быть выбрано при вызове метода get(). Просто установите значение null, если вы не хотите генерировать исключение.
В Java 6 вы можете использовать следующее:
Promise<T> p = new Promise<T>();
p.resolve(value);
return p.getFuture();