В более общем смысле:
Учитывая экземпляр 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;
}
}
Нет необходимости в процессе. Любое решение (даже использующее процессы) почти наверняка потребует каких-то изменений в коде вызываемых объектов. Это самое простое (просто замените System.out на this.out).
person
noah
schedule
04.12.2008