为什么这个程序停止执行

时间:2015-03-09 16:35:57

标签: java multithreading terminal

我是Threads,进程和终端的新手。 到目前为止它并没有那么糟糕,但我被卡住了。

在我的chiplotleErrorStream中,它永远不会到达:

它只是打印出找不到绘图仪的所有错误(我没有连接电缆)。但它永远不会:

System.out.println("it never reaches or prints this");

我无法理解为什么。 我做错了什么?

import java.io.*;

public class ExecTest {

    ChiplotleInputStream chiplotleInputStream;
    ChiplotleErrorStream chiplotleErrorStream;

    PrintWriter pw;

    public static void main(String[] args) {

        new ExecTest().setup();

    }


    // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


    public void setup() {

        try {
            Runtime runTime = Runtime.getRuntime();

            Process process = runTime.exec("chiplotle");

            chiplotleInputStream = new ChiplotleInputStream(process);
            chiplotleErrorStream = new ChiplotleErrorStream(process);

            OutputStream os = process.getOutputStream();
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
            pw = new PrintWriter(bw);


            new Thread(chiplotleInputStream).start();
            new Thread(chiplotleErrorStream).start();

//            process.destroy();

        }
        catch (IOException e) {
            e.printStackTrace();
        }

    }


    // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


    public class ChiplotleInputStream implements Runnable {

        BufferedReader in;

        public ChiplotleInputStream(Process process) {
            in = new BufferedReader(new InputStreamReader(process.getInputStream()));
        }

        @Override
        public void run() {

            while (true) {

                String line;

                try {
                    while ((line = in.readLine()) != null) {
                        System.out.println(line);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

                try {
                    Thread.sleep(100);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }


        }
    }


     // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


     public class ChiplotleErrorStream implements Runnable {

         BufferedReader in;

         public ChiplotleErrorStream(Process process) {
             in = new BufferedReader(new InputStreamReader(process.getErrorStream()));
         }

         @Override
         public void run() {

             while (true) {

                 String line;

                 try {
                     while ((line = in.readLine()) != null) {
                         System.out.println(line);
                     }
                 } catch (Exception e) {
                     e.printStackTrace();
                 }

                 System.out.println("it never reaches or prints this");
                 // hoping for errors in the terminal so we see something
                 // but if it doesn't come here...
                 pw.println("dfsfsdfsdf");

                 try {
                     Thread.sleep(100);

                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }


         }
     }

    // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


}

1 个答案:

答案 0 :(得分:0)

您正在运行一个程序,在输出任何内容之前需要输入。

所以你创建的过程只是坐在那里,等着你把命令写入你创建的PrintWriter

只要进程处于活动状态并且正在等待,它就不会向其输出流(您的进程输入流)输出任何内容,也不会向其错误流输出任何内容。

因此,您在这些流上创建的阅读器上的readLine()方法只是被阻止,等待一些输入通过。您标记的行只会在chiplotle应用程序退出后执行,此时它将关闭其流,readLine()将获得null