给定一个实例 x
的 Callable<T>
, 我怎样才能运行 x
在一个单独的进程中,以便我可以重定向进程的标准输入和输出?例如,有没有办法构建一个 Process
来自Callable
?有没有标准Executor
可以控制输入和输出?
[更新] Callable
并不重要在新进程而不是新线程中执行。我想要的是把 Callable
“线束”中的实例,以便我可以控制它的标准输入/标准输出。据我所知,这需要一个新流程。
最佳答案
更一般地说:
Given an instance x of Callable utilizing global variables A and B, how can I run x concurrently such that x sees custom values for A and B, rather than the "original" values of A and B?
最好的答案是,不要使用全局变量。依赖注入(inject)之类的东西。扩展 Callable 并添加方法 setStdIn、setStdOut(如果需要,还可以添加 setStdErr)。
我知道这不是您正在寻找的答案,但我看到的所有解决方案都需要一个新流程,而将 Callable 放入新流程的唯一方法是更改代码Callable 所以它是可序列化的,或者提供一个类名,或者其他一些 hack,所以不要做出会给你一个讨厌的、脆弱的解决方案的改变,而是做正确的事*
* “正确”是使用广泛接受的依赖注入(inject)模式来提供松耦合。 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;
}
不需要流程。任何解决方案(即使是使用进程的解决方案)几乎肯定需要以某种方式对 Callable 进行代码更改。这是最简单的(只需将 System.out 替换为 this.out)。
关于Java:在单独的进程中运行 Callable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/342435/