2012-04-05 2 views
0

私はRunnableを実装するJavaクラスを持っています。 runメソッドでは、次のコードを取得していますが、なぜそれが動作するのか、誰かがそれを私に説明できることを期待していたのかを完全には理解できません。スレッドのこの側面の少しの説明を使用することができます

コードは次のとおりです。だから、

public void run() { 
    Process p = null; 
    ProcessBuilder builder = new ProcessBuilder(); 
    builder.redirectErrorStream(true); 

    p = builder.command("/opt/program/testscript.sh").start(); 

    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line; 

    try { 
    while ((line = br.readLine()) != null) { 
     log.info(line); 
    } 

    boolean running = true; 
    while(running) { 
     p.waitFor(); 
     running = false; 
    }  

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
     p.destroy(); 
    } 
} 

、上部には、実行中のプロセスからの出力を取得し、それを表示しています。中間の部分は、スレッドが処理するのをコードが待つ場所のようです。私が理解しているように、コードは停止し、スレッドが終了するまでp.waitFor()コマンドでwhileループで待ってから、すべてを終了する必要があります。しかし、スレッドが実行されている間は、出力が表示され続けているので、上のwhileループがまだヒットしていることは明らかです。

スレッディングは常に私の弱点であり、明らかに私はここで何が起こっているのかを完全に把握していません。私はそれが有効だと思うので、コードは動作します。おそらくコード化されていないのでしょうか?とにかく、助けていただきありがとうございます。すべての情報について

UPDATE

感謝。 while(実行中)ループは何もしないという意味になります。私はそれを削除します。上記のコードの残りの部分を追加しました。私が以前に提供していないコードは、誰かがさらに追加するものがある場合に備えて、さらにコンテキストを提供するために提供していません。

+0

あなたが探していた解決策や説明が回答から得られましたか? – Attila

+0

実際には、私は彼らが質問に答えたと思う。良い点、私は受け入れられた答えとして1つマークします。 – cardician

答えて

1

最初のループは、誰もがいっぱいになると終了します。brは、それを閉じます。

p.waitFor()実際にはpが終了するまで待機します。ループはちょうど1回実行されるので一種の無効なので、削除することもできます。

Sooo ... pが完了して終了するまでbrを補うものとすれば、waitForは非常に短時間だけ待機する必要があります。

何が起こっているのかをより正確に理解するには、pのコードの後ろに、brのコードと、これらのことをどのように開始するのかが必要です。

1

brからのすべての入力がなくなるまでトップループが実行されると、スレッドはプロセスpの実行が完了するまで待つ必要があります。

brにまだ入力があるので、出力が継続して表示されることはありますか?

1

p.waitFor()は、プロセスが終了するのを待っているスレッドで、スレッドが終了するまで待機しません。スレッドが中断された場合(つまり、プログラムの別の部分がスレッドの参照でinterrupt()を呼び出すことを選択したことを意味します。通常はプログラムがシャットダウンしているため)、終了するプロセスが終了する前にp.destroy()が処理を終了します。 waitForの周りのwhileループは役に立たない。

Runnableを実装するコードを見ていますが、そのRunnableを使ってスレッドが作成された場所については何も言わないでください。その部分を見て、私はそのスレッドを使用して作成されている別のスレッドが期待される。

関連する問題