Jake Walsh
Jake Walsh

Reputation: 3869

How to create a completed future in java

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

Answers (6)

Dave
Dave

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

Louis Wasserman
Louis Wasserman

Reputation: 198053

Guava defines Futures.immediateFuture(value), which does the job.

Upvotes: 44

AlexV
AlexV

Reputation: 562

In Java 6 you can use the following:

Promise<T> p = new Promise<T>();
p.resolve(value);
return p.getFuture();

Upvotes: -7

Alex Worden
Alex Worden

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

Andrejs
Andrejs

Reputation: 27677

In Java 8 you can use the built-in CompletableFuture:

 Future future = CompletableFuture.completedFuture(value);

Upvotes: 253

hoaz
hoaz

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

Related Questions