gpt4 book ai didi

java - Thread 类中的 Run 方法未被调用

转载 作者:行者123 更新时间:2023-12-01 06:41:32 24 4
gpt4 key购买 nike

我是线程世界的新手,已经尝试解决这个问题一周了。

由于某种原因,Thread 类中的 run 方法没有被调用,我不知道为什么(但很想知道)

        ProcessBuilder processBuilder = new ProcessBuilder();

processBuilder.command("/bin/sh", "-c", "echo \"w30000001z,none,16488,,181075\nw30000001z,none,16488,,181082\n\" | /home/beehive/bin/exec/tableSize");
Process process = processBuilder.start();
process.waitFor();

InputStream stdin = process.getInputStream();
OutputStream stdout = process.getOutputStream();
InputStream stderr = process.getErrorStream();

BufferedReader reader = new BufferedReader(new InputStreamReader(stdin));
BufferedReader error = new BufferedReader(new InputStreamReader(stderr));
StreamGobbler errorStream = new StreamGobbler(process.getErrorStream(), "ERROR");
StreamGobbler outputStream = new StreamGobbler(process.getInputStream(), "OUTPUT");

errorStream.start();
outputStream.start();
errorStream.join();
outputStream.join();

tableSize 是一个 python 可执行文件,它通过其标准输入获取输入,对其进行处理并输出几行文本。我需要收集此输出并对其进行进一步处理。

有一个单独的线程来处理 inputStream 和 errorStream 上的输出。该线程类如下所示。

/* StreamGobbler.java */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;

class StreamGobbler extends Thread
{
InputStream is;
String type;
OutputStream os;

StreamGobbler(InputStream is, String type)
{
this(is, type, null);

}
StreamGobbler(InputStream is, String type, OutputStream redirect)
{
this.is = is;
this.type = type;
this.os = redirect;
}

public void run()
{
try
{
PrintWriter pw = null;
if (os != null)
pw = new PrintWriter(os);

System.out.println("Ajay" + type);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ( (line = br.readLine()) != null)
{
if (pw != null)
pw.println(line);
System.out.println(type + ">" + line);
}
if (pw != null)
pw.flush();
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}

由于某种原因,StreamGobbler 类中的 run 方法没有被调用。然而,该类的构造函数正在执行。

任何帮助将不胜感激。

最佳答案

您需要在调用 process.waitFor() 之前启动流 gobbler。

流吞噬者读取并丢弃外部进程输出/错误流,以便外部进程在尝试写入时不会阻塞。但按照您的方式,在您尝试吞噬输出之前,该进程必须完成写入(并退出)。

结果 - 死锁...如果外部进程向其输出流写入太多内容。

<小时/>

实际上,我认为主要问题是您的Java代码没有向inputStream写入任何内容。因此,外部进程只是坐在那里等待永远不会到达的输入......并且 process.waitFor() 等待外部进程。死锁。

正确的顺序应该是:

  1. 构建流程并启动它。
  2. 构建 gobbler 并启动它们。
  3. 打开输入流。
  4. 将内容写入输入流。
  5. 关闭输入流。
  6. 调用process.waitFor()并检查进程返回代码。
  7. 查看 gobblers 捕获的输出

关于java - Thread 类中的 Run 方法未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5457366/

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