Runnable.run
メソッドが入力として何も取り、出力として何も返さない理由を理解しようとしていますか?
スレッドのローカル変数 (参照またはプリミティブ) は独自のスタックから取得する必要があることは理解していますが、システムは初期化されている可能性があります。言い換えれば、技術的に不可能だとは思いません (間違っているかもしれませんが)。
Runnable.run
メソッドが入力として何も取り、出力として何も返さない理由を理解しようとしていますか?
スレッドのローカル変数 (参照またはプリミティブ) は独自のスタックから取得する必要があることは理解していますが、システムは初期化されている可能性があります。言い換えれば、技術的に不可能だとは思いません (間違っているかもしれませんが)。
何かを返すことは便利であり、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がメソッドの単なるホルダーではなくオブジェクトであるという事実により、暗黙的に渡される任意の数の値を使用できます。
ARunnable
はそのようなものであり、おそらく探しているのはCallable
代わりに、そのcall()
メソッドを介して値を返します。そして、引数を:に渡すことができないというのは真実ではありませんRunnable
。それは単にインターフェースの実装に依存します。同じことがCallable
。
Callable
Javaには、 sを非同期で実行するための機能もたくさんあります。を参照してくださいExecutorService
。そして、全体像についてはこれを読んでください。
の契約によりRunnable
、それはより高いレベルの抽象化が構築される完璧な原材料になります。これは、関心の分離の原則の良い例です。
Runnable
の主な設計目標は、新しい実行スレッドへのエントリポイントを表すことでした。関数や計算を表すものではなく、別のスレッドで実行されるコードだけを表します。それを考慮に入れると、void run()
メソッドシグネチャは完全に理にかなっています。引数を受け入れた場合、それは引数を渡したくない多くのユースケースにのみ負担をかけます。
voidの戻り値の場合はさらに明確です。スレッドが開始されると、報告する相手がいないため、戻り値の概念そのものが単なるタックオンになります。