12

System.currentTimeMillis();を使用して、毎秒コード行を実行しようとしています。

コード:

     while(true){
           long var = System.currentTimeMillis() / 1000;
           double var2 = var %2;

           if(var2 == 1.0){

               //code to run

           }//If():

        }//While

ループ全体が無限であるため、var2が1.0に複数回設定されているため、実行したいコードは複数回実行されます。var2が最初に1.0に設定されたときにコード行を実行し、次にvar2が0.0の後に1.0になるたびに実行したいと思います。

4

5 に答える 5

22

秒が変わるのを忙しく待ちたい場合は、以下を使用できます。

long lastSec = 0;
while(true){
    long sec = System.currentTimeMillis() / 1000;
    if (sec != lastSec) {
       //code to run
       lastSec = sec;
    }//If():
}//While

より効率的なアプローチは、次の1秒までスリープすることです。

while(true) {
    long millis = System.currentTimeMillis();
    //code to run
    Thread.sleep(1000 - millis % 1000);
}//While

別の方法は、ScheduledExecutorServiceを使用することです

ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();

ses.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        // code to run
    }
}, 0, 1, TimeUnit.SECONDS);

// when finished
ses.shutdown();

このアプローチの利点は、

  • 同じスレッドを共有する期間が異なる多数のタスクを持つことができます。
  • 非反復遅延または非同期タスクを持つことができます。
  • 別のスレッドで結果を収集できます。
  • 1つのコマンドでスレッドプールをシャットダウンできます。
于 2012-10-29T12:53:04.800 に答える
4

Javaエグゼキュータライブラリを使用します。実行可能で、任意の期間実行できるScheduledPoolを作成できます。例えば

Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new MyRunnable(), 0, 5, TimeUnit.SECONDS);

MyRunnableクラスを5秒ごとに実行します。MyRunnableはRunnableを実装する必要があります。これに伴う問題は、それが(効率的に)毎回新しいスレッドを作成することであり、それは望ましい場合と望ましくない場合があります。

于 2012-10-29T12:49:37.103 に答える
2

java.util.Timerjava.util.TimerTaskクラスを使用する必要があります。

于 2012-10-29T12:45:03.533 に答える
2

使用Thread.sleep();することはあなたの場合に最適でしょう。

 while(true)
 {
    Thread.sleep(1000); // Waiting before run.
    // Actual work goes here.
 }
于 2012-10-29T12:45:36.213 に答える
1

推奨される方法:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

次に、次のようなRunnablesを渡します。

scheduler.scheduleWithFixedDelay(myRunnable, initDelay, delay, TimeUnit.MILLISECONDS);

タイマーは使いません。スケジューラーは、タイマーが引き起こす可能性のある問題を処理するように構築されています。また、Thread.sleepは、概念実証タイプのものを証明するためにすばやく作成する単純なプログラムには適していますが、エンタープライズの世界では使用しません。

于 2012-10-29T12:52:36.663 に答える