1

ブロッキングコマンドとして機能し、1秒に1回シェルコマンドを実行するというループがあります。Javaは「ループでスリープ」について警告します。コードは次のとおりです。

    while (!Shell.silentShellCommand(stringCommand).contains("Device detected")) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            log.errorHandler(ex);
        }
    }

確かにこれを行うためのより良い方法があります。方法がわかりません。「ブロッキングタイマー方式」を作成する適切な方法は何でしょうか。これを使用して、ユーザーが何かをするまで実行を一時停止しています。

4

3 に答える 3

2

毎秒何かを実行したい場合は、より良い方法があります:

最初にタイマーを作成します。

Timer timer = new Timer();

次に、固定時間の実行をスケジュールします。

timer.scheduleAtFixedRate(new TimerTask() {
  @Override
  public void run() {
    // Your repeatable execution here
  }
}, 1000, 1000);

それでおしまい。私が助けることができることを願っています。

于 2013-02-07T01:56:56.287 に答える
1

このようなことをしてみませんか:

public void loopMethod(){
    if(!Shell.silentShellCommand(stringCommand).contains("Device detected")){
        try {
            Thread.sleep(1000);
        } catch(InterruptedException ex) {
            ex.printStackTrace();
        }
        loopMethod();
    }
}

そして、バックグラウンドスレッドからそのメソッドを呼び出すだけです。それはうまくいくでしょうか?つまり、技術的にはまだループですが、何らかの理由できれいに見えます!

于 2013-02-07T02:42:46.987 に答える
0

古典的な変形はwait()
//待機スレッドを使用することです

synchronized (mutex) {
     wait();
}

//他のスレッドはウェイターが目を覚ます必要があるときに通知します

synchronized (mutex) {
     notify();
}

タスクが定期的にコードを実行することである場合は、TimerTask 例を使用します。Giovanniの回答を参照してください。

于 2013-02-07T01:58:17.020 に答える