2011-07-01 10 views
22

W JDK, to realizowane jako:Jaki jest cel snu (long millis, int nanos)?

public static void sleep(long millis, int nanos) 
throws InterruptedException { 
if (millis < 0) { 
     throw new IllegalArgumentException("timeout value is negative"); 
} 

if (nanos < 0 || nanos > 999999) { 
     throw new IllegalArgumentException(
      "nanosecond timeout value out of range"); 
} 

if (nanos >= 500000 || (nanos != 0 && millis == 0)) { 
    millis++; 
} 

sleep(millis); 
} 

co oznacza nanos argumentu nic nie robi w ogóle.

Czy pomysł na to, że na sprzęcie o dokładniejszym czasie, JVM może zapewnić lepszą implementację?

+3

cóż, robi to * coś *, to podskakuje co najmniej pół milisekundy lub jeśli ms wynosi zero. –

+1

cóż, tak nie * nic * ... ale to nic nie warte. –

+0

Kod źródłowy pochodzi z Open JDK? – Marcelo

Odpowiedz

11

Regularne OS nie posiada wystarczającej ilości drobnoziarnistego rozdzielczość do spania dla nanosekund na raz. Istnieje jednak real time operating systems, w którym planowanie zdarzenia w dokładnie momencie jest krytyczne, a opóźnienia wielu operacji są BARDZO niskie. System ABS jest jednym z przykładów systemu operacyjnego czasu rzeczywistego. Spanie w nanosekundach jest o wiele bardziej użyteczne w takich systemach niż w zwykłych systemach operacyjnych, w których system operacyjny nie może spać spokojnie przez okres krótszy niż 15 ms.

Jednak posiadanie dwóch oddzielnych JDK nie jest rozwiązaniem. W związku z tym w systemach Windows i Linux JVM zrobi najlepszą próbę usypiania dla nanosekund o długości x.

+0

Minimum 15ms, o którym mówisz, jest prawdziwe tylko w systemie Windows. W Linuksie możesz zrobić 1ms snu. Ale nawet w systemie Windows można użyć ['timeBeginPeriod()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd757624.aspx), aby zwiększyć rozdzielczość timera, co pozwoli spać również w krótszych odstępach czasu. Jest to jednak ustawienie globalne (wpływające na wszystkie uruchomione programy) i zwiększy zużycie procesora, zużycie energii, a także "obniży ogólną wydajność systemu". W rzeczywistości może to mieć znaczący wpływ na programy, które wykonują funkcję "uśpienia (1)", opierając się na domyślnym przedziale 15ms. –

7

Wygląda na przyszłościowy dodatek, gdy wszyscy mamy laptopy petaflop i rutynowo określamy opóźnienia w nanosekundach. W międzyczasie, jeśli określisz opóźnienie nanosekundy, otrzymasz opóźnienie milisekundy.

Gdy sprzęt się poprawia, a maszyna JVM podąża, aplikacja nie musi być przepisywana.

0

Problem z przyszłą korektą jest zgodny wstecz. Ta metoda działała w ten sposób tak długo, że jeśli chcesz opóźnień sub-mikro-sekund trzeba użyć różnych metod.

Dla porównania

Object.wait(millis, nano); 
+3

To jest zaimplementowane dokładnie tak, jak "sleep (...)". po prostu wywołuje 'wait (millis)', chyba że 'millis == 0 || nanos> = 500000', w tym przypadku wywoływane jest 'wait (millis + 1)' –