Thread.sleep în Java

sleep() oprește firul curent pentru un timp; interrupt() trimite unui fir semnalul să se oprească din așteptare.

Sintaxă
static void sleep(long milisecunde) throws InterruptedException
static void sleep(Duration durata) throws InterruptedException   // Java 19
void interrupt()

Ce face Thread.sleep

Thread.sleep(ms) pune firul curent în pauză cel puțin numărul dat de milisecunde. Este o metodă statică: altFir.sleep(1000) tot firul curent îl adoarme. Din Java 19 poți da și un Duration: Thread.sleep(Duration.ofSeconds(2)).

fir.interrupt() cere unui fir să se oprească. Dacă firul doarme sau așteaptă (sleep, join, wait), primește imediat InterruptedException; altfel i se setează doar un indicator, pe care îl poate verifica cu Thread.currentThread().isInterrupted(). Firul decide singur cum se oprește: nu există o oprire forțată sigură.

Pentru că sleep aruncă InterruptedException (excepție verificată), trebuie să o prinzi sau să o declari cu throws.

Parametri

Parametru Descriere
milisecunde Durata pauzei.
durata Durata ca java.time.Duration.

Ce returnează

Nimic. sleep aruncă InterruptedException dacă firul este întrerupt.

Exemple

Exemplul 1: Numărătoare inversă

import java.time.Duration;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        for (int i = 3; i >= 1; i--) {
            System.out.println(i + "...");
            Thread.sleep(300);
        }
        Thread.sleep(Duration.ofMillis(200));
        System.out.println("Start!");
    }
}

Rezultat

3...
2...
1...
Start!

Exemplul 2: Oprirea unui fir care doarme

Firul ar trebui să doarmă 10 secunde, dar interrupt() îl trezește imediat.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread backup = new Thread(() -> {
            try {
                System.out.println("Backup: aștept ora programată...");
                Thread.sleep(10_000);
                System.out.println("Backup pornit");
            } catch (InterruptedException e) {
                System.out.println("Backup anulat");
            }
        });
        backup.start();
        Thread.sleep(200);
        backup.interrupt();
        backup.join();
        System.out.println("Gata");
    }
}

Rezultat

Backup: aștept ora programată...
Backup anulat
Gata

Exemplul 3: Un fir care verifică singur semnalul

Firul lucrează fără să doarmă, deci verifică periodic indicatorul de întrerupere.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread lucrator = new Thread(() -> {
            long pasi = 0;
            while (!Thread.currentThread().isInterrupted()) {
                pasi++;
            }
            System.out.println("Oprit după " + (pasi > 0 ? "mai mulți" : "zero") + " pași");
        });
        lucrator.start();
        Thread.sleep(100);
        lucrator.interrupt();
        lucrator.join();
        System.out.println("Fir oprit: " + !lucrator.isAlive());
    }
}

Rezultat

Oprit după mai mulți pași
Fir oprit: true

Greșeli frecvente

  • Prinzi InterruptedException și nu faci nimic: semnalul de oprire se pierde. Fie te oprești, fie restaurezi semnalul cu Thread.currentThread().interrupt().
  • Folosești sleep ca să „aștepți” alt fir: nu știi cât durează. Folosește join() sau alte mecanisme de sincronizare.

Comenzi înrudite

  • Thread: Un fir de execuție: cod care rulează în paralel cu restul programului. start() îl pornește, join() așteaptă să se termine.
  • Thread.currentThread: currentThread() dă firul care rulează codul; getName() îi dă numele, iar isAlive() spune dacă firul încă rulează.
  • System.currentTimeMillis: currentTimeMillis() dă ora curentă în milisecunde de la 1 ianuarie 1970; nanoTime() măsoară precis durate.
  • try, catch și finally: try încearcă un bloc de cod, catch prinde și tratează excepțiile aruncate în el, iar finally rulează mereu la ieșire.