8

スリープ 10 を待たずに Runtime.getRuntime().exec(p) を実行するにはどうすればよいですか?? 現在のところ、それは間違っています。exec が完了するまで待ってから、次に移動します。その場でexecを実行する必要がある場合は、10秒後にPresentationInProjector.jpgを強制終了できるようにします。

Example:

   Runtime.getRuntime().exec("(sleep 10; echo '09|00|CC|01|83|88' | nc localhost 58888) &");
   PlayThisSlideShow("PresentationInProjector.jpg");
4

3 に答える 3

11

ドキュメントによるとexec()

指定された文字列コマンドを別のプロセスで実行します。

したがって、 の返されたプロセスでexec()使用しない限り、 への呼び出しはブロックされません。waitFor()Runtime

ここに小さな例があります(例外処理は省略されています):

Process p=Runtime.getRuntime().exec("cmd.exe /c ping 127.0.0.1 -n 10");

System.out.println("Here 1");//this will execute immediately

try {

    p.waitFor();

    System.out.println("Here 2");//this will only be seen after +- 10 seconds and process has finished

} catch (InterruptedException ex) {
   ex.printStackTrace(); 
}
于 2012-10-01T07:16:35.717 に答える
5

exec()デフォルトでは、生成されたプロセスが終了するまでスレッドを待機させません。process.waitFor()現在のプロセスを待機させるには、明示的に呼び出す必要があります。PlayThisSlideShow("PresentationInProjector.jpg");の直後に呼び出されていると思いexec()ます。表示されるのは、子プロセスが実行されている限り、JVM プロセスを実行するシステムです。子プロセスがまだ実行されている間に親プロセスを強制終了するために、これを簡単に克服する方法はないと思います。

Java からプレゼンテーション プロジェクタを強制終了できないのはなぜですか?

于 2012-10-01T07:25:31.877 に答える
3
   Runtime.getRuntime().exec("(sleep 10; echo '09|00|CC|01|83|88' | nc localhost 58888) &");

あなたが期待することはしません。Runtime.execはシェルではなく、()グループ化;|. ただし、実行しようとしているアクションは純粋に Java で実行できるため、外部プロセスを実行する必要はありません。例 (例外処理は省略):

new Thread(new Runnable() {
  public void run() {
    Thread.sleep(10000); //sleep 10
    Socket s = new Socket("localhost", 58888); // nc
    PrintWriter pw = new PrintWriter(s.getOutputStream());
    pw.print("09|00|CC|01|83|88\n"); // echo
    pw.close();
    s.close();
  }
}).start();
于 2012-10-01T07:50:04.263 に答える