2016-04-30 3 views
2

Я использую ProcessBuilder для запуска внешнего процесса, но мне нужно уметь его убивать. Прямо сейчас у меня нет проблем с убийством процесса, но по какой-то причине поток ошибок не закрывается, поэтому поток, читающий поток, никогда не заканчивается. Это мешает мне закрыть мою программу.Java Stop Process and Close Streams

Здесь я начинаю чтение потоков из потоков ввода и ошибок.

   final Thread inputPrinter = new Thread() { 
        public void run() { 
         BufferedReader inputStream = new BufferedReader(new InputStreamReader(builder.getInputStream())); 
         String line; 
         try { 
          while ((line = inputStream.readLine()) != null) { 
           Util.println(line, false); 
          } 
         } catch (IOException e) { 
         } finally { 
          Util.println("input end"); 
          try { 
           inputStream.close(); 
          } catch (IOException e) { 
          } 
         } 
        } 
       }; 
       inputPrinter.start(); 

       Thread errorPrinter = new Thread() { 
        public void run() { 
         BufferedReader errorStream = new BufferedReader(new InputStreamReader(builder.getErrorStream())); 
         String line; 
         try { 
          while ((line = errorStream.readLine()) != null) { 
           Util.println(line, true); 
          } 
         } catch (IOException e) { 
         } finally { 
          Util.println("error end"); 
          try { 
           errorStream.close(); 
          } catch (IOException e) { 
          } 
         } 
        } 
       }; 
       errorPrinter.start(); 
       builder.waitFor(); 

       Util.println(""); 
       Util.println("Finished building project."); 

Вот мой код для остановки процесса.

 try { 
      builder.getOutputStream().close(); 
      builder.getInputStream().close(); 
      builder.getErrorStream().close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     builder.destroy(); 
     Util.println(""); 
     Util.println("Build aborted by user.", true); 

Когда я пытаюсь остановить процесс, я получаю следующее распечатаны.

Построение прерывается пользователем.

Готовый проект.

входной конец

Я никогда не «конец» ошибки и отладки программы показывает поток просто сидит на «ReadLine()».

Код, ожидающий выполнения процесса, запущен в его собственном потоке (отдельно от кода, который убивает процесс).

Что мне нужно сделать, чтобы убедиться, что поток errorPrinter затухает?

+0

Что произойдет, если вы не закрываете потоки перед вызовом destroy? – assylias

+1

Что у всех пустых блоков catch? Вы знаете, что это не просто плохой код, это абсолютно ** опасный код. –

+0

Если я не звоню близко к потокам раньше, то происходит то же самое. Почему пустые блоки блокировки опасны, если мне все равно, если он просто остановится? – EmbMicro

ответ

0

У меня была такая же проблема, я использую speechRecognizer, так я бегу отдельную тему, который работает под управлением другой .jar, который печатает на консоль и читать вывод, используя BufferedReader (что-то вроде этого ..):

//In seperate Thread from the Main App Thread 
while (!stopped) { 
       while ((line = bufferedReader.readLine()) != null && !line.isEmpty()) { 
        System.out.println(line); 
        checkSpeechResult(line); 
       } 
      } 

проблема

в основном bufferedRead.readLine() запаздывает до тех пор, пока что-то читать.

Если ничего не произойдет, он будет ждать вечно.

Ответ:

С другой Thread называют это:

process.destroy(); 

и остановит процесс поэтому bufferedRead.readLine() будет выходить.