0

アプリのようなしっぽを書きたいです。このアプリは、バックグラウンドでの変更についてファイルをスキャンし、何かが変更された場合にイベントを発生させます。

ユーザーがctrl+c(デフォルトで動作)を押してアプリケーションを終了するように要求するまで、アプリケーションを実行したいと思います。while(true)ATMのように無限ループを実行するだけで、多くのCPU負荷を発生させたくありません。

try {
        // thread doing the monitoring
        thread.start();

        // forcing the programm not to exit
        while (System.in.available() == 0) {
            Thread.sleep(5000);
        }

    } catch (final IOException e) {
        e.printStackTrace();
    }

誰かがこれのためのよりエレガントな/正しいアプローチを知っていますか?

4

2 に答える 2

2

そもそもなぜスレッドを使用しているのかわかりません。「tail」unixスクリプトは、while(true)終了条件のない単なるループです。ファイルを監視し、変更が検出された場合はそれを出力します。デフォルトでは1秒間休止すると思うので、基本的には次のようになります。

while(true) {
   // Code goes here. Watch file, System.out.print if it changes

   Thread.sleep(1000);
}

スレッドは必要ありません。run()ただし、アプリを存続させるための最良の方法に関する質問に答えるには、スレッドのメソッドから戻らないでください。スレッドに参加する必要はありません。デーモンを実行していないスレッドが1つある限り、アプリケーションはフォアグラウンドに留まります。

于 2012-05-10T13:53:47.650 に答える
0

ビジーウェイトなしでSystem.inを読みたい場合は、非常に簡単に実行できます。InputStreamにはブロッキングセマンティクスがあるため、必要なのはreadメソッドの1つを呼び出すことだけで、入力が利用可能になるまでブロックされます。テキスト入力をスキャンする場合は、お勧めしBufferedReader.readLineます。また、メインスレッドでそれを行います。別のスレッドを開始しても意味がありません。

于 2012-05-10T13:53:08.423 に答える