如何在Java中创建完整的未来


82

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

1
最好的方法是不创造一个!;-)为什么需要实施Future?您不能使用现有的对象来返回未来吗?
assylias 2012年

1
我怀疑没有人存在,因为我从未见过拥有它的理由。也许您可以解释您要做什么?
彼得·劳里

1
@PeterLawrey我想他需要一些API,出于某种扭曲的原因,它想与期货合作,即使它实际上只需要其值。或者他需要它来嘲笑。至少那是我能想象的唯一原因。
立方

9
单元测试将是一个很好的理由-一个模拟的服务返回带有测试值的未来。
Louis Wasserman

3
@立方体。如果您有一个接受Callable <T>的方法,又有谁可能或可能不会异步运行该作业,这取决于可用资源或其他因素(如先前已经提供的选项)如何?想象一下,如果Executor.execute(Runnable)取一个Callable <T>作为参数并决定在执行线程中运行它,那么实现就不需要创建自己的Future <T>了吗?
马丁·安德森

Answers:


65

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

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

请参阅下面的Andrejs的答案,它可能是您所寻找的更多内容
nathanfranke

194

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

 Future future = CompletableFuture.completedFuture(value);

这将给您一个完整的未来。而是使用new CompletableFuture()。
zafar142003 '18

8
@ zafar142003 OP要求一个完整的未来,不是吗?
Andrejs

从班级的问题细节(2012年)来看,我认为OP希望实现“ CompletableFuture”实现。但是我想,这现在是一个有争议的问题。
zafar142003

从课程中的问题详细信息来看,OP希望它具有立即价值。看到isDone总是返回true。因此,这是一个很好的答案。
nathanfranke


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

-3

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

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

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


2
通常,在com.sun.*包中使用任何东西都不是一个好主意。这些类通常被认为是内部实现细节,并且易于在Java版本之间进行更改。
詹姆斯·金斯伯里

-6

在Java 6中,您可以使用以下代码:

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

3
我认为Java核心库中没有。它使用什么外部依赖性?
乔恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.