0

Runnable.runメソッドが入力として何も取り、出力として何も返さない理由を理解しようとしていますか?

スレッドのローカル変数 (参照またはプリミティブ) は独自のスタックから取得する必要があることは理解していますが、システムは初期化されている可能性があります。言い換えれば、技術的に不可能だとは思いません (間違っているかもしれませんが)。

4

4 に答える 4

7

何かを返すことは便利であり、1つのオブジェクトを返すことができるCallableによってサポートされています。

Future<MyReturnType> ret = executor.submit(new Callable<MyReturnType>() {
    public MyReturnType call() throws Exception {
         // do something
         return new MyReturnType(value1, value2 ...);
    }
});

ご覧のとおり、ExecutorServiceはFutureオブジェクトを使用して値をスレッドに戻すホールドをサポートしているため、Callableは値を返すことができます。これはJava5.0でのみ追加されたためRunnable、値を返す前は、この戻り値の行き先がなかったため、役に立ちませんでした。


Runnableは、任意の数のフィールドを保持できるオブジェクトであるため、引数を取る必要はありません。例えば

 static void bgLog(final Level level, final String message, final Throwable t) {
    logExec.submit(new Runnable() {
        // the anonymous nested class implicitly holds a copy of the final arguments above.
        public void run() {
           LOG.log(level, message, t);
        }
    });
 }

ご覧のとおり、run()メソッドは、Runnableがメソッドの単なるホルダーではなくオブジェクトであるという事実により、暗黙的に渡される任意の数の値を使用できます。

于 2013-01-02T11:11:28.533 に答える
6

ARunnableはそのようなものであり、おそらく探しているのはCallable代わりに、そのcall()メソッドを介して値を返します。そして、引数を:に渡すことができないというのは真実ではありませんRunnable。それは単にインターフェースの実装に依存します。同じことがCallable

CallableJavaには、 sを非同期で実行するための機能もたくさんあります。を参照してくださいExecutorService。そして、全体像についてはこれを読んでください。

于 2013-01-02T11:11:22.247 に答える
4

の契約によりRunnable、それはより高いレベルの抽象化が構築される完璧な原材料になります。これは、関心の分離の原則の良い例です。

Runnableの主な設計目標は、新しい実行スレッドへのエントリポイントを表すことでした。関数や計算を表すものではなく、別のスレッドで実行されるコードだけを表します。それを考慮に入れると、void run()メソッドシグネチャは完全に理にかなっています。引数を受け入れた場合、それは引数を渡したくない多くのユースケースにのみ負担をかけます。

voidの戻り値の場合はさらに明確です。スレッドが開始されると、報告する相手がいないため、戻り値の概念そのものが単なるタックオンになります。

于 2013-01-02T11:11:36.560 に答える
3

どちらかと言えば何が欲しいですか?

現状では、実装するクラスはRunnableコンストラクターで初期化できます。コンストラクターを使用すると、何でも自由に実行できます。初期化。何も返さないCallableことに関しては、戻り値を可能にするインターフェースが常にあります。

おそらく、これらのインターフェースはvoidメソッドとnon-voidメソッドに相当するものと見なす必要があります:-)

乾杯、

于 2013-01-02T11:12:54.490 に答える