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
私はそれを持っている理由を見たことがないので、何も存在しないと思います。おそらくあなたはあなたがやろうとしていることを説明することができますか?
Peter Lawrey 2012

1
@PeterLawrey本当に必要なのは値だけなのに、何らかのねじれた理由で先物を処理したいAPIのために彼が必要としていると思います。または彼はそれをあざけるために必要とします。少なくともそれが私が想像できる唯一の理由です。
キュービック

9
ユニットテストは、これが必要な完全な理由です。モックされたサービスがテスト値で未来を返します。
Louis Wasserman 2012

3
@キュービック。Callable <T>を受け入れるメソッドがあり、利用可能なリソースや、以前に提供されたオプションなどの他の要因に応じて、ジョブを非同期で実行する場合と実行しない場合はどうでしょうか。場合を想像してexecutor.execute(Runnableを)を代わりにパラメータとして呼び出し可能<T>を取り、実行中のスレッドでそれを実行することを決定し、実装する必要がその後、彼自身の未来の<T>を作成することではないでしょうか?
マーティンアンデソン2014

回答:


65

Apache Commons Langは、ConstantFutureと呼ばれる同様の実装を定義しています。これは、次のコマンドで取得できます。

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

以下のAndrejsの回答を参照してください、それはあなたが探しているものの多くかもしれません
nathanfranke

194

Java 8では、組み込みのCompletableFutureを使用できます。

 Future future = CompletableFuture.completedFuture(value);

これはあなたに完全な未来を与えるでしょう。代わりに、新しいCompletableFuture()を使用してください。
zafar1420 0318年

8
@ zafar142003 OPは完全な未来を求めましたね?
Andrejs 2018年

質問の詳細(2012年)のクラスから判断すると、OPは「CompletableFuture」の実装を望んでいたと思います。しかし、私は推測します、これは今や論点です。
zafar142003 2018年

質問の詳細でクラスから判断すると、OPは即時の価値を持つ未来を望んでいたようです。isDone常にtrueを返すことを確認してください。したがって、これは優れた答えです。
nathanfranke


2
FutureTask<String> ft = new FutureTask<>(() -> "foo");
ft.run();

System.out.println(ft.get());

「foo」を出力します。

get()が呼び出されたときに例外をスローするFutureを使用することもできます。

FutureTask<String> ft = new FutureTask<>(() -> {throw new RuntimeException("exception!");});
ft.run();

-3

Javart.jarであなたと非常によく似たクラスを見つけました

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

get()が呼び出されたときにスローされる可能性のある例外を指定することもできます。例外をスローしたくない場合は、nullに設定してください。


2
一般的に、com.sun.*パッケージ内の何かを使用することは良い考えではありません。これらのクラスは通常、内部実装の詳細と見なされ、Javaのバージョン間で変更される可能性があります。
JamesKingsbery19年

-6

Java 6では、以下を使用できます。

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

3
それはJavaコアライブラリにはないと思います。どのような外部依存関係を使用していますか?
Jorn 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.