Java 当试图从子';读取时,程序挂起;s过程标准输出

Java 当试图从子';读取时,程序挂起;s过程标准输出,java,process,io,Java,Process,Io,我等待启动一个进程,将一个整数传递给它,然后得到一个值并打印出来。我(在Windows中)尝试了以下操作: mFilename是可执行文件的路径。进程返回1表示正输入,0表示负输入,如果mParam为0,则它将保持在无限循环中。然而,我发现无论我传递给它什么值,retVal总是1。我做错了什么 请原谅我在几分钟前删除了这个问题,我以为问题出在retVal中,但显然这不是该代码中的唯一问题 子进程,用C++编写: #include <iostream> #include <Win

我等待启动一个进程,将一个整数传递给它,然后得到一个值并打印出来。我(在Windows中)尝试了以下操作:

mFilename
是可执行文件的路径。进程返回1表示正输入,0表示负输入,如果
mParam
为0,则它将保持在无限循环中。然而,我发现无论我传递给它什么值,
retVal
总是1。我做错了什么

请原谅我在几分钟前删除了这个问题,我以为问题出在
retVal
中,但显然这不是该代码中的唯一问题

子进程,用C++编写:

#include <iostream>
#include <Windows.h>

bool f(int x)
{
    if (x)
        return x > 0;

    while (1)
        Sleep(100);
}

int main()
{
    int x;
    std::cin>>x;
    std::cout<<f(x);
}
但是,不管输入是什么,此修复程序在

char retVal = (char) input.read();

这个解决方案非常简单:
std::cin
只需要一个换行符就可以成功读取整数。结果代码如下所示:

public Boolean call() throws IOException, InterruptedException, ExecutionException, TimeoutException {
    Process p = Runtime.getRuntime().exec(mFilename);
    final BufferedReader input = new BufferedReader
            (new InputStreamReader(p.getInputStream()));
    final BufferedWriter output = new BufferedWriter
            (new OutputStreamWriter(p.getOutputStream()));
    output.write(Integer.toString(mParam));
    output.newLine();
    output.flush();

    ExecutorService executor = Executors.newFixedThreadPool(2);
    Callable<Character> readTask = new Callable<Character>() {
        @Override
        public Character call() throws Exception {
            return Character.valueOf((char)input.read());
        }
    };
    Future<Character> future = executor.submit(readTask);
    char readVal;
    try {
        readVal = future.get(3L, TimeUnit.SECONDS);
    } finally {
        p.destroy();
        executor.shutdownNow();
    }

    return !(readVal == '0');
}
public Boolean call()抛出IOException、InterruptedException、ExecutionException、TimeoutException{
进程p=Runtime.getRuntime().exec(mFilename);
最终BufferedReader输入=新BufferedReader
(新的InputStreamReader(p.getInputStream());
最终BufferedWriter输出=新BufferedWriter
(新的OutputStreamWriter(p.getOutputStream());
output.write(Integer.toString(mParam));
output.newLine();
output.flush();
ExecutorService executor=Executors.newFixedThreadPool(2);
Callable readTask=新的Callable(){
@凌驾
公共字符调用()引发异常{
返回字符.valueOf((char)input.read());
}
};
Future=executor.submit(readTask);
字符读取值;
试一试{
readVal=future.get(3L,时间单位为秒);
}最后{
p、 破坏();
执行者。关机现在();
}
返回!(readVal=='0');
}

注意,我添加了对“无限循环”案例场景的支持。如果我们无法在3秒内从stdout获取输出,我们将抛出异常并终止子进程。我在这里不处理异常,因为函数必须返回一些结果,但在无限循环的情况下,我没有任何结果可返回。

如果没有子进程的源代码,很难知道出了什么问题。你是否试过打印出
retVal
,看看它实际上是“1”,而不仅仅是
!=”0'
?@BenLawry,是的,它实际上是“1”,至少NetBeans调试器显示了“1”。@prazuber我将把它放到我的IDE中并尝试一下,请忽略我的答案,不确定我是否能够删除我自己的答案。好吧,我也被难倒了。我把你的子进程C++代码复制到.NET 2010中,并构建了一个控制台应用程序…正如我从命令行运行它时所述。复制您的
Example.java
,得到与您相同的结果。我尝试了一些不同的方法,当我进行实验时,我要么总是得到1,要么程序永远不会返回(挂起)。如果你弄明白了,请发一个答案。
char retVal = (char) input.read();
public Boolean call() throws IOException, InterruptedException, ExecutionException, TimeoutException {
    Process p = Runtime.getRuntime().exec(mFilename);
    final BufferedReader input = new BufferedReader
            (new InputStreamReader(p.getInputStream()));
    final BufferedWriter output = new BufferedWriter
            (new OutputStreamWriter(p.getOutputStream()));
    output.write(Integer.toString(mParam));
    output.newLine();
    output.flush();

    ExecutorService executor = Executors.newFixedThreadPool(2);
    Callable<Character> readTask = new Callable<Character>() {
        @Override
        public Character call() throws Exception {
            return Character.valueOf((char)input.read());
        }
    };
    Future<Character> future = executor.submit(readTask);
    char readVal;
    try {
        readVal = future.get(3L, TimeUnit.SECONDS);
    } finally {
        p.destroy();
        executor.shutdownNow();
    }

    return !(readVal == '0');
}