TimeUnit în Java

Enumerarea unităților de timp (SECONDS, MINUTES…) folosită la așteptări; face conversii și pauze ușor de citit.

Sintaxă
import java.util.concurrent.TimeUnit;

TimeUnit.NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS
void sleep(long durata) throws InterruptedException
long toMillis(long durata)
long convert(long durata, TimeUnit sursa)

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 este long și partea fracționară se pierde; pentru durate exacte folosește Duration.

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.