1

コマンドを使用してプログラムに遅延を追加したいThread.sleep(1000)(したがって、続行する前に 1 秒間停止する) が、これはthrows InterruptedException. とはいえ、どこに置いたらいいのかわからない。

私のコードは基本的に次のようになります。

public static void main(String[] args) {
    Clock myClock = new Clock;   // new clock object.

    while (true) {
        myClock.tick();
    }
}

私の他のクラス:

public class Clock {
    // .. some constructors and stuff

    public void tick() {
        secondHand.draw();   // redraws the second hand to update every second
    }

    // .. some more methods and stuff
}

メソッドを 1 秒ごとに呼び出すだけにしたいのですが、 andステートメントtick()をどこに置けばよいかわかりません。どんな助けでも大歓迎です。また、時計を刻んだり更新したりできる他の方法についての情報も役立ちます。Thread.sleepthrows InterruptedException

4

5 に答える 5

5

tick() メソッドのみを 1 秒ごとに呼び出したい

を呼び出した後、tick()次のように現在のスレッドをスリープ状態にします。

public static void main(String[] args) {
    Clock myClock = new Clock;   // new clock object.

    while (true) {
        myClock.tick();
        // wait for a second.
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException ie) {
            // Handle the exception
        }
    }
}
于 2012-10-30T03:30:45.390 に答える
1

私は通常それを提案しませんが。

この場合、これが中断されることを実際にコーディングする必要はありません。ランタイム例外でラップして非表示にします。

public class Clock {
    // .. some constructors and stuff

    public void tick() {
       secondHand.draw();   // redraws the second hand to update every second
    }
    public void wait() {
       try {
           Thread.sleep(1000)
       } catch(InterruptedException e) {
           throw new RuntimeException("Don't know how to handle this", e);
       }
    }
   // .. some more methods and stuff
}
于 2012-10-30T03:59:19.533 に答える
1

プログラムのフローに応じて、Thread.sleep(1000);ステートメントを制御ロジックに配置する必要があります。これは、ロジックがtick()メソッドを呼び出す場合は、慣例により、ロジックコントロール(この場合はThread.sleep(1000);ステートメント)を導入するのに最適な場所であることを意味します。

残念ながら、呼び出しロジックは次のようになります。

try {
    while (true) {
        Thread.sleep(1000);
        myClock.tick();
    }
} catch(InterruptedException e) {
    System.err.println("Something went wrong");
}

このアプローチにより、tick()メソッドにアクセスする他の制御ロジックがある場合、それが1秒の遅延に縛られることはありません。通常、クライアントが異なればニーズも異なります...

スケーラビリティの安全な読みやすさのために、whileループ全体をtry catchブロックでラップすることを好みます...つまり、tick()メソッドのロジックがより複雑になり、より多くの例外をスローすることになった場合は、catch句をに追加するだけです。次のようにcatchブロックを試してください。

try {
    while (true) {
        Thread.sleep(1000);
        myClock.tick();
    }
} catch(InterruptedException e) {
    System.err.println("Something went wrong");
} catch(SomeNewExcetion e) {
    System.err.println("Something went wrong");
} catch(SomeOtherNewExceptoion e) {
    System.err.println("Something went wrong");
} catch(SomeFinalException e) {
    System.err.println("Something went wrong");
}
于 2012-10-30T03:43:01.027 に答える
1

または のいずれjavax.swing.Timerかを使用java.util.Timerして、同じ結果を得ることができます。

javax.swing.Timerは、トリガーされたときにActionPerformedメソッドがイベント ディスパッチ スレッド内で実行されるという利点があり、UI の更新が容易になります。

java.util.Timer

timer = new Timer();
timer.schedule(new TickTock (), 1000);

public class TickTock extends TimerTask {
    public void run() {
        System.out.println("Tick tock!");
    }
}

javax.swing.Timer

Timer timer = new Timer(1000, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Tick tock!");
        repaint();
    }
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();

詳細については、スイングタイマーの使用方法をお読みください。javax.swing.Timer

于 2012-10-30T03:44:33.620 に答える
0

そのJavaで非常にシンプル

TimeUnit.SECONDS.sleep(2);
于 2015-09-16T12:25:58.330 に答える