より一般的には:
グローバル変数AとBを利用するCallableのインスタンスxが与えられた場合、xがAとBの「元の」値ではなく、AとBのカスタム値を参照するようにxを同時に実行するにはどうすればよいですか?
そして最良の答えは、グローバル変数を使用しないことです。依存性はそのようなものを注入します。Callableを拡張し、メソッドsetStdIn、setStdOut(および必要に応じてsetStdErr)を追加します。
これがあなたが探している答えではないことは知っていますが、これについて私が見た解決策はすべて新しいプロセスを必要とし、Callableを新しいプロセスに取り込む唯一の方法はCallableのコードを変更することですシリアル化可能であるか、クラス名またはその他のハックを提供するため、厄介で脆弱なソリューションを提供する変更を加える代わりに、正しく実行してください*
*「正しい」とは、広く受け入れられている依存性注入のパターンを使用して、緩い結合を提供することです。YMMV
更新:コメント1への応答:新しいインターフェースは次のとおりです。
import java.io.InputStream;
import java.io.PrintStream;
import java.util.concurrent.Callable;
public interface MyCallable<V> extends Callable<V> {
void setStdIn(InputStream in);
void setStdOut(PrintStream out);
}
タスクは次のようになります。
import java.io.InputStream;
import java.io.PrintStream;
public class CallableTask implements MyCallable<Object> {
private InputStream in = System.in;
private PrintStream out = System.out;
public void setStdIn(InputStream in) {
this.in = in;
}
public void setStdOut(PrintStream out) {
this.out = out;
}
public Object call() throws Exception {
out.write(in.read());
return null;
}
}
プロセスの必要はありません。すべてのソリューション(プロセスを使用するソリューションでも)は、ほぼ確実に、何らかの方法でCallablesのコードを変更する必要があります。これが最も簡単です(System.outをthis.outに置き換えるだけです)。