Reputation: 3869
What is the best way to construct a completed future in Java? I have implemented my own CompletedFuture
below, but was hoping something like this that already exists.
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();
}
}
Upvotes: 118
Views: 80168
Reputation: 14178
FutureTask<String> ft = new FutureTask<>(() -> "foo");
ft.run();
System.out.println(ft.get());
will print out "foo";
You can also have a Future that throws an exception when get() is called:
FutureTask<String> ft = new FutureTask<>(() -> {throw new RuntimeException("exception!");});
ft.run();
Upvotes: 5
Reputation: 198053
Guava defines Futures.immediateFuture(value)
, which does the job.
Upvotes: 44
Reputation: 562
In Java 6 you can use the following:
Promise<T> p = new Promise<T>();
p.resolve(value);
return p.getFuture();
Upvotes: -7
Reputation: 3415
I found a very similar class to yours in the Java rt.jar
com.sun.xml.internal.ws.util.CompletedFuture
It allows you to also specify an exception that can be thrown when get() is invoked. Just set that to null if you don't want to throw an exception.
Upvotes: -3
Reputation: 27677
In Java 8 you can use the built-in CompletableFuture:
Future future = CompletableFuture.completedFuture(value);
Upvotes: 253
Reputation: 10153
Apache Commons Lang defines similar implementation that is called ConstantFuture, you can get it by calling:
Future<T> future = ConcurrentUtils.constantFuture(T myValue);
Upvotes: 71