gpt4 book ai didi

Java:在单独的进程中运行 Callable

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:30:04 27 4
gpt4 key购买 nike

给定一个实例 xCallable<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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com