java - Python 和 Java 接口(interface) - 多线程输入和输出流

标签 java python multithreading stream

我有一个 Python 应用程序和一个 Java 应用程序同时运行。 我希望 Java 启动 Python 进程,然后使用普通的 STDIN/STDOUT 流与 Python 进行通信。 我已经正确启动了该进程,并且有两个线程来处理两个 I/O 流。

输出线程:

class output2 extends Thread {

Process process;
OutputStream stdin;
BufferedWriter writer;
Scanner in = new Scanner(System.in);

output2(Process p) {
    try {
        process = p;
        stdin = process.getOutputStream();
        writer = new BufferedWriter(new OutputStreamWriter(stdin));
    } catch (Exception e) {
        System.out.println("ERROR output2(): " + e);
    }
}

@Override
public void run() {
    System.out.println("Starting OUTPUT THREAD");
    try {
        while (true) {
            String input = in.nextLine();
            writer.write(input);
            writer.flush();
        }
    } catch (Exception e) {
        System.out.println("ERROR output2_run(): " + e);
    }
    System.out.println("Ending OUTPUT THREAD");
}
}

输入线程:

class input2 extends Thread {

Process process;
InputStream stdout;
BufferedReader reader;

input2(Process p) {
    try {
        process = p;
        stdout = process.getInputStream();
        reader = new BufferedReader(new InputStreamReader(stdout));
    } catch (Exception e) {
        System.out.println("ERROR input2(): " + e);
    }
}

@Override
public void run() {
    System.out.println("Started INPUT THREAD");
    try {
        while (true) {
            System.out.println(Thread.currentThread().getName() + " is executing");
            if (reader.readLine() != null) {
                System.out.println("Stdout: " + reader.readLine());
            }
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() + " stopped executing");
        }
    } catch (Exception e) {
        System.out.println("ERROR input2_run(): " + e);
    }
    System.out.println("Ending INPUT THREAD");
}
}

主要:

public class My_Java {

public static void main(String args[]) {
    File file = new File("C:\\Location\\");
    try {
        Process process = Runtime.getRuntime().exec("C:\\Python27\\python.exe chat_from_file.py", null, file);
        input2 input = new input2(process);
        output2 output = new output2(process);
        input.setName("INPUT THREAD");
        output.setName("OUTPUT THREAD");
        input.start();
        output.start();
    } catch (Exception e) {
        System.out.println("ERROR main(): " + e);
    }
}
}

这似乎根本没有给出任何回应。 它启动两个线程,表示 INPUT THREAD 正在执行,但此后什么也没有执行。 我哪里出错了?

最佳答案

首先,在输入类中调用 if (reader.readLine() != null) { 后,您实际上已经读取了该行,下一次调用将返回 null.

使用ready检查非阻塞读取的可能性。不要预先阅读。

但是,我很确定您的进程存在异常,例如 python: can't open file 'chat_from_file.py': [Errno 2] No such file or directory 或者,抛出堆栈跟踪并退出。

使用getErrorStream如果存在错误,检查进程输出的内容。这将使您走上解决问题的正确道路。

此外,为了以防万一,请确保确实有一些东西可供阅读。确保您的 Python 应用程序输出足够的数据以便刷新缓冲区(或刷新其写入)。

并且不要忘记干净、正确地加入和退出。祝你好运。

关于java - Python 和 Java 接口(interface) - 多线程输入和输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20324993/

相关文章:

java - 网格中的 Vaadin 过滤器

java - 优化低于O(n²)的圆内圆检测算法

java - 为什么不能在执行时实现重载呢?

python - 使用 cgitb 获取 HTML 正文

spring - 阻止 Spring MVC Controller ?

c++ - 是否可以使用线程来加快文件读取速度?

Java 递归食物分配

使用 twiny 时 Python Matplotlib 图形标题与轴标签重叠

Python Librosa Keras 神经网络错误 : Too Many Indices For Array

c# - 如何每天在同一时间在 C# 服务中执行一次代码?