如何在java中创建一个完整的未来

时间:2012-12-13 18:56:49

标签: java future

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

6 个答案:

答案 0 :(得分:151)

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

 Future future = CompletableFuture.completedFuture(value);

答案 1 :(得分:53)

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

Future<T> future = ConcurrentUtils.constantFuture(T myValue);

答案 2 :(得分:34)

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

答案 3 :(得分:0)

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();

答案 4 :(得分:-3)

我在Java rt.jar

中找到了一个非常类似的类

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

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

答案 5 :(得分:-5)

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

Horse