0

私は現在のJavaプロジェクトでタイマーを動作させようとしています。このタイマーは、無限ループ内でnマイクロ秒ごとに整数変数に1を追加します(たとえば、1/2秒の場合は500)。これにより、プログラムの実行中は常にタイマーが実行されます。これが私が現在持っているコードです:

public class Ticker
{
    public int time = 0;
    long t0, t1;

    public void tick(int[] args)
    {
        for (int i = 2; i < 1; i++)
        {
            t0 = System.currentTimeMillis();
            do
            {
                t1 = System.currentTimeMillis();
            }
            while (t1 - t0 < 500);
            time = time + 1;
        }
    }
}

みんなが私の最後の質問でとても役に立ちました、うまくいけばこれは同じくらい簡単です

4

6 に答える 6

2

私はあなたが欲しいと思います

Thread.sleep(500);

現時点では、500ミリ秒待機するCPUサイクルを消費しています(マイクロ秒について言及していますが、ミリ秒が必要だと思います)。上記により、現在のスレッドが500ミリ秒間スリープ状態になり、プロセスはCPUを消費しません(または少なくとも、ガベージコレクションは引き続き実行されます)。バージョンを実行するときにCPUを監視すると、違いがわかります。

詳細については、こちらをご覧ください。

于 2012-11-20T16:01:14.977 に答える
1

別のスレッドでそれを行う必要がある場合は、タイマーを見てください:

int delay = 500; //milliseconds
ActionListener taskPerformer = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        time++
    }
};
new Timer(delay, taskPerformer).start();

上記のコードはローカル変数を利用できないことに注意してください(final匿名クラスでそれらにアクセスするように宣言する必要があります)。ただし、メンバーになることはできます。

于 2012-11-20T16:03:31.193 に答える
1

これは、500ミリ秒間隔で変数をScheduledExecutorService更新する比較可能な例です。time

ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);

exec.scheduleAtFixedRate(new Runnable(){
    private int time = 0;

    @Override
    public void run(){
        time++;
        System.out.println("Time: " + time);
    }
}, 0, 500, TimeUnit.MILLISECONDS);

このアプローチは、Timerを使用するよりも優先されます。

于 2012-11-20T16:14:49.690 に答える
0

あなたが持っているものは、次のウェイクアップ時間を待つCPUサイクルを浪費するので、かなり非効率的です。もし私があなたなら、を使って関数を書き直しますThread.sleep()

現在のコードが機能しない理由については、forループ条件がオフになっているため、ループに入ることがありません。

プログラムにある他のロジックと同時にタイマーコードを実行するには、スレッド化を調べる必要があります。

于 2012-11-20T16:01:01.623 に答える
0

マルチスレッドを調べたいと思うかもしれません。SOでこれを検索すると、いくつかの優れた質問/回答スレッドが見つかります。Webの他の場所にもチュートリアルがあります...

于 2012-11-20T16:03:12.783 に答える
0

Timer以上のScheduledExecutorServiceをご覧ください。これらを使用すると、定期的にアクションを実行し、それを取り巻く計算を処理できます。

于 2012-11-20T16:05:59.737 に答える