W programowaniu wielowątkowym w Javie, wątki można kategoryzować jako wątki użytkownika (user threads) lub wątki daemon. Wątki daemon różnią się od zwykłych wątków tym, że nie zapobiegają zakończeniu się procesu JVM, gdy tylko wątki użytkownika zakończą swoje działanie. Jeśli więc wszystkie wątki użytkownika w programie zakończą działanie, JVM zakończy działanie niezależnie od tego, czy wątki daemon nadal działają. W praktyce oznacza to, że wątki daemon są zazwyczaj używane do zadań wspierających, które nie powinny blokować zakończenia programu, na przykład: zbieranie śmieci, monitorowanie wydajności itp.
Przykład kodu
Załóżmy, że mamy już uruchomiony wątek, który wykonuje pewne zadania w tle. Poniżej znajdziesz przykład kodu w Java, który pokazuje, jak można przekształcić istniejący wątek w wątek daemon, nawet jeśli wątek już działa.
// Klasa definiująca zadanie wątku
class Task implements Runnable {
public void run() {
// Pętla nieskończona symulująca długotrwałą pracę
while (true) {
try {
// Symulacja wykonania zadania
Thread.sleep(1000);
System.out.println("Praca w tle");
} catch (InterruptedException e) {
System.out.println("Wątek został przerwany");
return;
}
}
}
}
public class DaemonThreadExample {
public static void main(String[] args) throws InterruptedException {
// Tworzenie nowego obiektu wątku
Thread thread = new Thread(new Task());
// Sprawdzenie, czy wątek jest demonem
System.out.println("Czy wątek jest daemonem? " + thread.isDaemon());
// Ustawienie wątku jako daemon przed jego uruchomieniem
thread.setDaemon(true);
thread.start();
// Dajemy wątkowi trochę czasu na wykonanie pracy
Thread.sleep(5000);
System.out.println("Główny wątek zakończy swoje działanie");
}
}
Komentarze do kodu:
Runnable
jest interfejsem, którego implementacja jest wymagana do stworzenia nowego wątku.Task
to klasa, która implementujeRunnable
i definiuje działanie wątku, tutaj symuluje nieskończoną pracę w tle.thread.setDaemon(true);
przekształca wątek w wątek daemon. Ważne jest, aby wywołać tę metodę przed uruchomieniem wątku (thread.start()
).- Główny wątek (
main
) pozwala na wykonanie się wątkowi daemon przez określony czas (5 sekund), a następnie zakończy działanie. Ponieważ jedyny działający wątek to daemon, JVM zakończy działanie.
Podsumowanie
Przekształcenie wątku w daemon w Javie jest stosunkowo proste i wymaga wywołania metody setDaemon(true)
na obiekcie Thread
przed jego uruchomieniem. Wątki daemon są bardzo przydatne w aplikacjach, gdzie potrzebujemy wykonywać zadania pomocnicze w tle bez blokowania zakończenia programu. Ważne jest, aby pamiętać, że wątki daemon nie powinny być używane do wykonania krytycznych zadań, które muszą być dokończone przed zakończeniem działania programu.
Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.