未调用Thread类中的Run方法

aja*_*ore 0 java multithreading iostream processbuilder

我是一个非常新的线程世界的人,一直试图解决这个问题一个星期了.

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();
Run Code Online (Sandbox Code Playgroud)

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

有一个单独的线程来处理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();  
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,没有调用StreamGobbler类中的run方法.但是,正在执行此类的构造函数.

任何帮助将非常感激.

Ste*_*n C 9

您需要启动流Gobblers的打电话process.waitFor().

流gobblers读取并丢弃外部进程输出/错误流,以便外部进程在尝试写入时不会阻塞.但是你拥有它的方式,在你尝试吞噬输出之前,这个过程必须完成写入(和退出).

结果 - 死锁...如果外部进程对其输出流写入太多.


实际上,我认为主要问题是你的Java代码没有写任何东西inputStream.因此,外部进程只是坐在那里等待从未到过的输入......并process.waitFor()等待外部进程.僵局.

事情的正确顺序应该是:

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