Daemon Threads в Java

1. Общ преглед

В тази кратка статия ще разгледаме демоновите нишки в Java и ще видим за какво могат да се използват. Ще обясним и разликата между демоновите нишки и потребителските нишки.

2. Разлика между Daemon и User Threads

Java предлага два типа нишки: потребителски нишки и демонови нишки.

Потребителските нишки са нишки с висок приоритет. JVM ще изчака всяка потребителска нишка да завърши задачата си, преди да я прекрати.

От друга страна, демоновите нишки са нишки с нисък приоритет, чиято единствена роля е да предоставят услуги на потребителски нишки.

Тъй като демоновите нишки са предназначени да обслужват потребителски нишки и са необходими само докато потребителските нишки се изпълняват, те няма да попречат на JVM да излезе, след като всички потребителски нишки приключат изпълнението си.

Ето защо безкрайни цикли, които обикновено съществуват в демон конци, няма да доведе до проблеми, защото всеки код, включително и най-накрая блокове, няма да бъдат изпълнени, след като всички потребителски теми са приключили тяхното изпълнение. Поради тази причина демоновите нишки не се препоръчват за I / O задачи.

Има обаче изключения от това правило. Лошо проектираният код в демонови нишки може да попречи на JVM да излезе. Например извикването на Thread.join () на работеща нишка на демон може да блокира изключването на приложението.

3. Използване на Daemon Threads

Нишките на Daemon са полезни за фонови поддържащи задачи като събиране на боклук, освобождаване на памет на неизползвани обекти и премахване на нежелани записи от кеша. Повечето от JVM нишките са демони.

4. Създаване на Daemon Thread

За да зададем нишка да бъде демонова нишка, всичко, което трябва да направим, е да извикаме Thread.setDaemon (). В този пример ще използваме класа NewThread, който разширява класа Thread :

NewThread daemonThread = new NewThread(); daemonThread.setDaemon(true); daemonThread.start();

Всяка нишка наследява демона на състоянието на нишката, която я е създала. Тъй като основната нишка е потребителска нишка, всяка нишка, която е създадена вътре в основния метод, по подразбиране е потребителска нишка.

Методът setDaemon () може да бъде извикан само след като обектът Thread е създаден и нишката не е стартирана. Опит за извикване на setDaemon (), докато се изпълнява нишка, ще хвърли IllegalThreadStateException :

@Test(expected = IllegalThreadStateException.class) public void whenSetDaemonWhileRunning_thenIllegalThreadStateException() { NewThread daemonThread = new NewThread(); daemonThread.start(); daemonThread.setDaemon(true); }

5. Проверка дали нишката е демонова нишка

И накрая, за да проверим дали нишката е демонова нишка, можем просто да извикаме метода isDaemon () :

@Test public void whenCallIsDaemon_thenCorrect() { NewThread daemonThread = new NewThread(); NewThread userThread = new NewThread(); daemonThread.setDaemon(true); daemonThread.start(); userThread.start(); assertTrue(daemonThread.isDaemon()); assertFalse(userThread.isDaemon()); }

6. Заключение

В този бърз урок видяхме какво представляват демоновите нишки и за какво могат да се използват в няколко практически сценария.

Както винаги, пълната версия на кода е достъпна в GitHub.