В целом:
Учитывая экземпляр x Callable, использующий глобальные переменные A и B, как я могу запустить x одновременно, так что x видит пользовательские значения для A и B, а не «исходные» значения A и B?
И лучший ответ: не используйте глобальные переменные. Зависимости вводят такие вещи. Расширьте 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).