2015-09-30 11 views
8

Bir Saat, bir Anında ve geçerli bir Konu verildiğinde, Java kütüphanelerinde halihazırdaki iş parçacığı, verilen saat anlık hale gelene kadar uyuyan bazı (yardımcı program) yöntemi var mı?Belirli bir Saat'i kullanan bir Anlık'a kadar bir İş parçacığı uyku yapmak için Java 8'de bir yöntem var mı?

public static void sleepUntil(Instant instant, Clock clock) 
throws InterruptedException; 

gibi bir şey?

Özel bir yavaşlatılmış saatle çalıştığım bir test ayarında buna ihtiyacım var.

Uygulamanın kolay olduğunu biliyorum, ancak mevcutsa standart bir çözümü tercih ederim (ancak şimdiye kadar bulamadı).

+1

Aslında, belki de o kadar kolay değildir uygulamak için ... – Gustave

+0

Belki bir şekilde ['TimeUnit'] 'e (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html) dönüştürebilir ve' sleep'' diyebilirsiniz? –

+0

Hayır, çünkü TimeUnit'in özel saatin farkında olmasına imkan yok gibi görünüyor. – Gustave

cevap

0

Bunu yapmak için görebildiğim tek yol, bir süre döngüsü oluşturmak ve verilen ana ulaştığı zamandan kopmaktır.

public static void sleepUntil(Instant instant, Clock clock) throws InterruptedException { 
    while (clock.millis() < instant.toEpochMilli()) { 
     Thread.sleep(1000); 
    } 
} 

Sabit saat için, bu sonsuza kadar döngü olur. Her şeyden

+0

Bu işe yaramaz, çünkü Thread.sleep (uzun öğütücüler) sistem saatini kullanır ve özel saati kullanmaz. – Gustave

+0

@Gustave Tamam, sorunuzu yanlış anladım. Düzenlememe bak. – Tunaki

1

Öncelikle Clockimplementation ve few uses in the standard API küçük bir gerçekten basit sınıftır. SystemClock, OffsetClock ve TickClock aynı dosyadaki örneklerdir. Yani cevap Hayır gibi görünüyor, default API içinde değil.

siz "yavaşlatılmış saatini" verilir ve istenilen sleepUntil() -Kod eklemek için değiştiremez Eğer

ve size

public static void sleepUntil(Instant instant, Clock clock) 
    throws InterruptedException { 

    Instant now = Instant.now(clock); 
    long duration = now.until(instant, ChronoUnit.MILLIS); 
    long testSleep 
     = (duration < 10000)? (duration/10) : 1000; 
    long start = clock.millis(); 
    Thread.sleep(testSleep); 
    long stop = clock.millis(); 
    double clockskew = (stop - start)/testSleep; 

    now = Instant.now(clock); 
    Thread.sleep(now.until(instant, ChronoUnit.MILLIS) * clockskew); 
} 
gibi bir şey yapabileceğini, sabit bir tutarda
tarafından yavaşladı

Bu, önce saat eğimini belirlemek için bir test çalıştırması yapar, daha sonra ayarlanmış bir süre uyur.

(Belki başka saatine ayarlamak için sleep yılında anında ayarlamanız gerekir. Bunu test/sahibi olmak isteyen Saatli kodunu yazın düzeltilmiş.)

İlgili konular