Ce face TimeUnit
TimeUnit este o enumerare cu șapte unități de timp, de la NANOSECONDS la DAYS. Multe metode de concurență primesc o pereche „număr + unitate”: awaitTermination(5, TimeUnit.SECONDS), tryLock(200, TimeUnit.MILLISECONDS).
TimeUnit.SECONDS.sleep(2) face o pauză de 2 secunde; este echivalent cu Thread.sleep(2000), dar se citește mai ușor. Ca orice pauză, aruncă InterruptedException dacă firul este întrerupt.
Conversiile: TimeUnit.HOURS.toMinutes(2) dă 120; TimeUnit.MINUTES.convert(7200, TimeUnit.SECONDS) dă tot 120. Conversia spre o unitate mai mare taie partea fracționară (90 de secunde = 1 minut). Din Java 9 există toChronoUnit(), iar din Java 11 convert(Duration).
Parametri
| Parametru | Descriere |
|---|---|
durata |
Numărul de unități. |
sursa |
Pentru convert: unitatea în care este dată durata. |
Ce returnează
Metodele toX și convert returnează un long; sleep nu returnează nimic.
Exemple
Exemplul 1: Conversii între unități
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) {
System.out.println("2 ore = " + TimeUnit.HOURS.toMinutes(2) + " minute");
System.out.println("1 zi = " + TimeUnit.DAYS.toSeconds(1) + " secunde");
System.out.println("7200 s = " + TimeUnit.MINUTES.convert(7200, TimeUnit.SECONDS) + " minute");
System.out.println("90 s = " + TimeUnit.SECONDS.toMinutes(90) + " minut (partea fracționară se taie)");
System.out.println("1500 ms = " + TimeUnit.MILLISECONDS.toSeconds(1500) + " secundă");
}
}
Rezultat
2 ore = 120 minute
1 zi = 86400 secunde
7200 s = 120 minute
90 s = 1 minut (partea fracționară se taie)
1500 ms = 1 secundă
Exemplul 2: TimeUnit.sleep: pauză între încercări
Măsurăm durata pauzelor. Ea poate fi puțin mai mare decât cea cerută, niciodată mai mică.
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws InterruptedException {
long start = System.nanoTime();
for (int incercare = 1; incercare <= 3; incercare++) {
System.out.println("Încercarea " + incercare + " de conectare la server...");
TimeUnit.MILLISECONDS.sleep(100);
}
long ms = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
System.out.println("Au trecut cel puțin 300 ms: " + (ms >= 300));
}
}
Rezultat
Încercarea 1 de conectare la server...
Încercarea 2 de conectare la server...
Încercarea 3 de conectare la server...
Au trecut cel puțin 300 ms: true
Exemplul 3: Toate unitățile și legătura cu ChronoUnit
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) {
for (TimeUnit u : TimeUnit.values()) {
System.out.println(u + " -> " + u.toChronoUnit());
}
}
}
Rezultat
NANOSECONDS -> Nanos
MICROSECONDS -> Micros
MILLISECONDS -> Millis
SECONDS -> Seconds
MINUTES -> Minutes
HOURS -> Hours
DAYS -> Days
Greșeli frecvente
- Scrii
Thread.sleep(5 * 60 * 1000)și greșești calculul.TimeUnit.MINUTES.sleep(5)spune clar ce vrei. - Te aștepți ca
TimeUnit.SECONDS.toMinutes(90)să dea 1.5. Rezultatul estelongși partea fracționară se pierde; pentru durate exacte foloseșteDuration.
Comenzi înrudite
Duration: O cantitate de timp exactă, în secunde și nanosecunde (1 oră și 30 de minute); se afișează ca PT1H30M.ChronoUnit: Enumerarea unităților de timp (DAYS, MONTHS, HOURS…); ChronoUnit.DAYS.between(a, b) numără zilele dintre două date.ExecutorService: Un grup de fire de execuție care primește sarcini și le rulează; se oprește cu shutdown() și se așteaptă cu awaitTermination().CountDownLatch: Un numărător pentru așteptare: await() blochează până când alte fire apelează countDown() de N ori.ReentrantLock.tryLock: Încearcă să ia lacătul fără să aștepte la nesfârșit: returnează true dacă l-a luat, false dacă este ocupat.