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 cuThread.currentThread().interrupt(). - Folosești
sleepca să „aștepți” alt fir: nu știi cât durează. Foloseștejoin()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.