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

标签 java multithreading process stdout stdin

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

相关文章:

java - if 语句中的变量递增

java - 如何从 XSL 文件中调用 Java 函数?

java - eclipse RCP 中的 plugin.properties 机制

multithreading - 为什么此Scala代码在一个线程中执行两个Future?

android - thread.stop() 异常

c# - 使用来自文本文件的参数运行 exe

c# 7za.exe 进程状态

java - 防止客户端/服务器应用程序上的数据篡改

multithreading - 协程可以挂起然后在不同的线程上恢复吗?第一个线程的内存效应是否会传递到第二个线程?

完成 Activity 后android进程仍然存在