103

在 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();
    }
}
4

6 回答 6

223

在 Java 8 中,您可以使用内置的 CompletableFuture:

 Future future = CompletableFuture.completedFuture(value);
于 2015-02-17T14:37:53.840 回答
70

Apache Commons Lang 定义了类似的实现,称为 ConstantFuture,您可以通过调用来获取它:

Future<T> future = ConcurrentUtils.constantFuture(T myValue);
于 2012-12-13T19:02:21.083 回答
43

Guava定义了Futures.immediateFuture(value),它完成了这项工作。

于 2012-12-13T19:25:30.837 回答
4
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();
于 2019-09-10T18:58:13.117 回答
-3

我在 Java rt.jar 中找到了一个与您的非常相似的类

com.sun.xml.internal.ws.util.CompletedFuture

它还允许您指定在调用 get() 时可以抛出的异常。如果您不想引发异常,只需将其设置为 null 即可。

于 2015-06-25T19:37:00.773 回答
-6

在 Java 6 中,您可以使用以下内容:

Promise<T> p = new Promise<T>();
p.resolve(value);
return p.getFuture();
于 2016-08-22T06:07:52.953 回答