2

RunnableFuture インターフェースの定義の「正確さ」について質問があります。これは、Java でインターフェース コメントを定義するための正しい競合についての質問かもしれません。

RunnableFuture の run() メソッドの定義:

この Future をその計算の結果に設定します ...

ただし、run() の戻り値の型はvoidであり、RunnableFuture は単なるインターフェイスであるため、これが常に真であるとは限りません。これを保証するには、実装クラスの性質について何かを知る必要があるようです ( get() 実装など)。

ここで、RunnableFuture が実際に値を返した場合、それは隠されており、それ以外の場合はブロックしている get() 関数によって常に返されます。そのような定義 (実装の制限により、インターフェイスではなくクラスで発生する必要があります)、明らかに適切でしょう。

したがって、私は疑問に思っています: このインターフェイスの run() メソッドは正しく定義されていますか?

反例として、Runnable run() インターフェイス定義は常に正しいです。

インターフェイス Runnable を実装するオブジェクトを使用してスレッドを作成する場合、スレッドを開始すると、オブジェクトの run メソッドが個別に実行されているスレッドで呼び出されます。

したがって、Runnable は実装を定義していませんが、クラスの実装に保証されていないコントラクトを不必要に課すことなく、Runnable インターフェイスを介して JVM がスレッドを実装する方法をインターフェイスが教えてくれます。

だから私は3つの質問があります:

  1. RunnableFuture のドキュメントは、いくつかのケースで間違っている可能性がありますか?

  2. (1) の場合、それは Java の慣例で受け入れられますか?

  3. RunnableFuture run() と Runnable run() の「本当の」違いは何ですか?

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.htmlを参照してください。

4

1 に答える 1

1

のコントラクトはRunnableFutureによって実装されFutureTaskます。を作成するときは、またはと のFutureTaskいずれかの値を指定します。メソッドは次のようになります。CallableRunnablerunFutureTask

public void run() {
    V result;
    try {
        if(callable) {
            result = callable.call();
        } else {
            runnable.run();
            result = value;
        }
    } catch (Throwable t) {
        setException(t);
        return;
    }
    set(result);
}

ただし、実際の実装ではRunnable-value ペアが a にラップされ、が呼び出される前に正しい状態であるCallableことを確認するために追加のチェックが行われます。FutureTaskrun

于 2012-09-03T22:58:43.387 に答える