在java中使用多线程时冻结窗口

时间:2016-05-13 08:52:28

标签: java multithreading

我在java中有一个gui,当按下一个可执行按钮时,我想在GUI里面运行。我运行可执行文件的代码如下:

 new Thread(() -> {
 try {
     Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec("face.exe", null, new File("Release\\"));
    BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    BufferedReader err = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
      } catch (Exception e1) {
      // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    }).start();

当我按下按钮时可执行文件正在运行但是我检测到可执行行为中的冻结。我试图添加多线程来检查这是否是冻结的原因,但是我仍然经历过同样的事情。这可能有什么问题?

修改 我试图在我的线程中为inputStreamReader添加以下行:

InputStreamReader

我收到的消息{{1}}无法解析为某种类型。

2 个答案:

答案 0 :(得分:1)

由于您没有读取此进程对象的InputStream,因此它可能因为流的缓冲区已满而卡住,导致exe在写入stdout时阻塞。

答案 1 :(得分:1)

正如bowmore所提到的,您的可执行文件可能会阻塞,因为输出未被处理并且"卡住了#34;一段时间后,因为可执行文件无法向其标准输出写入更多内容(可能是控制台)。

我通常使用以下代码从java运行外部命令:

Process p = Runtime.getRuntime().exec(args);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader err = new BufferedReader(new InputStreamReader(p.getErrorStream()));

StreamHandler outputHandler = new StreamHandler(in);
outputHandler.start();

StreamHandler errorHandler = new StreamHandler(err);
errorHandler.start();

其中StreamHandler的定义如下:

class StreamHandler extends Thread {
        private final BufferedReader in;
        private final JTextArea[] textArea;

        public StreamHandler(final BufferedReader in) {
            this.in = in;
        }

        @Override
        public void run() {
            try {
                String line = null;
                while ((line = this.in.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (IOException e) {
                log.info("StreamHandler got interrupted");
                e.printStackTrace();
            }
        }
    }

当然,流处理程序可能更复杂,例如将错误写入System.err而不是System.out,或写入JTextArea或其他地方。