2016-04-30 12 views
2

私はProcessBuilderを使って外部プロセスを起動していますが、私はそれを強制終了する必要があります。今私は問題をプロセスを殺すが、何らかの理由で、エラーストリームがストリームを読んでスレッドが終了しないように閉じることはありません。これは私のプログラムを閉じないようにしてくれます。Java Stop Processと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

破壊を呼び出す前にストリームを閉じないとどうなりますか? – assylias

+1

空のキャッチブロックは何ですか?あなたはそれが悪いコードではないことを知っています、それはまったく危険な**コードです。 –

+0

前にストリームでクローズしないと、まったく同じことが起こります。 空のキャッチブロックは、停止しても気にしないとなぜ危険なのですか? – EmbMicro

答えて

0

私は同じ問題を抱えていた、私はので、私はBufferedReaderの(このような何かを。)使用して出力をコンソールと読むために印刷し、別の.jar実行されている別のスレッド実行していますspeechRecognizer、を使用します。

をそれは読んで何かを持っているまで
//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()が遅れています。

何も来なければ、それは永遠に待つでしょう。

回答:

から別のスレッドコールこの:

process.destroy(); 

、それはそうプロセスを停止bufferedRead.readLine(う)が終了します。