2011-01-17 25 views
4

私は、特定の時刻にスレッドの実行を開始したいと思っています。特定の時刻にスレッドを開始できるように、以下のコードでどのように時刻を設定できますか?与えられた時間間隔の後。 Advancedの (サンプルコードでは、私は事前に?時間を設定するには?

class BeeperControl { 

private final ScheduledExecutorService scheduler = 
    Executors.newScheduledThreadPool(1); 

public void beepForAnHour() { 

    final Runnable beeper = new Runnable() { 
      public void run() { System.out.println("beep"); } 
    }; 

    final ScheduledFuture<?> beeperHandle = 
     scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS); 

    scheduler.schedule(new Runnable() { 
      public void run() { beeperHandle.cancel(true); } 
    }, 60 * 60, SECONDS); 
} 
} 

が感謝することを行うことができますどのように、真夜中にブザーを開始したいとします。

答えて

1

..あなたがそれを必要とする正確な時刻にスケジュールする必要はありません。深夜から現在の時刻を引くことによって、どれだけの遅延が必要かを調べる。これは次のとおりです。

private static Date getMidnight(){ 
    Calendar cal = new GregorianCalendar(); 
    cal.add(Calendar.DAY_OF_MONTH,1); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    return cal.getTime(); 
} 

long initialDelay = (getMidnight().getTime() - System.currentTimeMillis())/1000; 
final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, initialDelay, 10, SECONDS); 
0

最初に、現在の時刻とタスクを実行する時刻の差をチェックしてスケジュールします。 uleAtFixedRateは... しかし、スレッドを警告されますが、深夜の後にブザーを実行したい場合、あなたは、スケジューラに渡すinitialDelayを変更する必要が

関連する問題