2016-11-19 5 views
1

私が持っている問題にアプローチする最善の方法について助言したいと思います。Java 8のLocalTimeを使用して、現在時刻が指定時刻よりも60秒前になるまでブロックしますか?

Java 8のLocalTimeを使用して、現在の時刻が指定された時刻の60秒前になるまでプログラムをブロックしますか?

だから、のようになります。そして、

LocalTime time1 = LocalTime.of(13, 11) 
LocalTime currentTime = LocalTime.now() 

のようないくつかのロジックを実装するいくつかのコード:(CURRENTTIME < TIME1まで - 60秒)のThread.sleepすべてのヘルプは素晴らしいことだ

、感謝!

答えて

3

LocalTimeminusSecondsの方法を使用して、時間を60秒間調整します(またはminusMinutesを使用)。その後、2時間の間の時間を取得するためにDuration.betweenを使用します。

LocalTime time1 = LocalTime.of(13, 11); 

LocalTime untilTime = time1.minusSeconds(60); 

LocalTime currentTime = LocalTime.now(); 

Duration duration = Duration.between(currentTime, untilTime); 

// TODO possibly check duration.isNegative() 

Thread.sleep(duration.toMillis()); 
0

まあ、60秒差でLocalTimeからLocalTimeを変換することは簡単です。しかし、待ち時間を得るためにLocalTime.now()との差を計算するのは魅力的ですが、差を計算する間に時間が経過するので、wait関数を呼び出すと値が不正確になります。

マルチタスキングシステムで待機しているとき、つまり、の待機時間後に任意の実行速度とスレッドスケジューリングが発生する場合は、一般的に不正確ですが、それ以上の昇格を避ける必要があります。

LocalTime target = LocalTime.of(12, 50).minusSeconds(60); 
long deadLine = target.atDate(LocalDate.now()).atZone(ZoneId.systemDefault()) 
         .toInstant().toEpochMilli(); 
while(System.currentTimeMillis() < deadLine) { 
    // in case you want to support interruption: 
    if(Thread.interrupted()) 
     throw new InterruptedException(); 
    LockSupport.parkUntil(target, deadLine); 
} 

このコードは、あなたが中断をサポートするか否かを決定することができます:

より良い解決策は、それが少し複雑に見えるかもしれません場合でも、期限を計算し、期限に達するのを待つことです。あなたがそれをサポートしていなくても、いわゆるスプリアスウェイクアップを正しく処理するためにループが必要になることに注意してください。しかし、ループの状態チェックとparkUntil呼び出しの間に経過時間がありますが、締め切りの性質のために処理されます。すなわち、parkUntilは、締め切りに達するとすぐに戻ります。

最初のパラメータはオプションです。つまり、代わりにparkUntil(deadLine)を呼び出すこともできます。これは、スレッドが待機している理由(例えば、引数が指定されると、スレッドダンプは次のようになります。

"main" #1 prio=5 os_prio=0 tid=0x0000000002b20800 nid=0x2aa8 waiting on condition [0x0000000002a2f000] 
    java.lang.Thread.State: TIMED_WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x000000076b007220> (a java.time.LocalTime) 
    at java.util.concurrent.locks.LockSupport.parkUntil(LockSupport.java:256) 
    … 

何が起きているのかを示します。また、待機時間が十分に長く続く場合、別のスレッドがgetBlockerを呼び出し、返されたオブジェクトを検査する可能性があります。

関連する問題