2016-08-31 2 views
-2

私は変数に時間の連続的に変化する値(ミリ秒単位)を格納し、それを他の時間値と比較していくつかのタスクを実行したいと思います。どうやってするの? 私のプログラムがコンパイルされると、変数に格納されるミリ秒の値はプログラム全体で同じになり、決して変更されないという問題があります。すべての条件が同じ時間と私はいくつかの仕事をしたい時間が比較される場合は、決して来ることはありません。私は時計の時間の変化と時間値の比較をしたい。私は助けに非常に感謝します。私は変数の時間の連続的に変化する値を保存し、その後いくつかのタスクを行うためにそれを他の時間と比較したい。それを行う方法

ここで私は(私はコンストラクタでそれを格納されている)継続時間を取得するために使用していたコードです:これは将来のタイミングである(

Thread clock = new Thread(){ 

     @Override 
     public void run() { 
      while(true){ 
       Calendar cal = Calendar.getInstance(); 
       millisAt_ONU = cal.getTimeInMillis(); 

      } 

    }; 

    clock.start(); 

と、私は時間とそれを比較するには、このコードを使用する - 私の条件は先となります実行する:

if(millisAt_ONU == receivedGATE_time8){  
//receivedGATE_time8 is the time which will come 

       try { 
        socOnu.sendReportHP(report_ONU_8_HP); 
        socOnu.sendReportLP(report_ONU_8_LP); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       System.out.println("--------------------------------\n"); 

       System.out.println("Sent REPORT for ONU-8!"); 

      } 
+1

'millisAt_ONU'はどのように宣言されていますか?あるスレッド内でその値を設定し、別のスレッドで値を読み込んでいるので、おそらく 'volatile 'でなければなりません。 –

+3

'millisAt_ONU == receivedGATE_time8'が' true'である可能性が非常に小さいことを認識していますか? – talex

+1

'Calendar.getInstance()。getTimeInMillis()'は大量の操作です。 'System.currentTimeMillis()'を使うのがより簡単で高速です – talex

答えて

0

単にそれは方法someAction1()someAction2()を持っているMySystemはあなたのプロセスの状態を維持するために書き込むいくつかのクラスで、この例では、指定した時刻に発生するタスクをスケジュール、&hellip。 ;その質問に示されているような行動を含んでいます。そして、t1,t2、…これらのアクションを発生させたいときは、「今」との相対的な遅延です。

MySystem system = ... /* Set up whatever you need as a context. */ 
ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); 
worker.schedule(system::someAction1, t1, TimeUnit.MILLIS); 
worker.schedule(system::someAction2, t2, TimeUnit.MILLIS); 
... 
worker.shutdown(); 

おそらくミリ秒の精度は得られません。正確なタイミングが必要な場合は、リアルタイムシステムを調べる必要があります。