Рубрики
Без рубрики

Темы Daemon на Java

Откройте для себя темы daemon на Java.

Автор оригинала: baeldung.

1. Обзор

В этой короткой статье мы посмотрим на темы daemon на Java и посмотрим, для чего они могут быть использованы. Мы также объясним разницу между потоками daemon и потоками пользователей.

2. Разница между Daemon и пользовательскими потоками

Java предлагает два типа потоков: пользовательские потоки и темы daemon.

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

С другой стороны, потоки daemon — это низкооритетные потоки, единственная роль которых заключается в предоставлении услуг пользовательским потокам.

Поскольку потоки daemon предназначены для обслуживания пользовательских потоков и необходимы только во время работы пользовательских потоков, они не помешают СПМ выйти из него после того, как все пользовательские потоки заготовит свое выполнение.

Вот почему бесконечные циклы, которые обычно существуют в потоках daemon, не вызовет проблем, потому что любой код, включая наконец блоки, не будут выполнены после того, как все пользовательские потоки заготовят свое выполнение. По этой причине потоки daemon не рекомендуются для задач в i/O.

Тем не менее, есть исключения из этого правила. Плохо разработанный код в потоках daemon может предотвратить выход JVM. Например, вызов Thread.join () на бегущем потоке daemon можно заблокировать выключение приложения.

3. Использование потоков Daemon

Потоки Daemon полезны для фоновой поддержки таких задач, как сбор мусора, выпуск памяти неиспользованных объектов и удаление нежелательных записей из кэша. Большинство потоков JVM являются темами daemon.

4. Создание дэмоновой нити

Чтобы установить поток, чтобы быть потоком daemon, все, что нам нужно сделать, это вызвать Thread.setDaemon (). В этом примере мы будем использовать NewThread класс, который расширяет Нить класс:

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

Любой поток наследует статус daemon потока, который его создал. Поскольку основной поток является пользовательским потоком, любой поток, созданный внутри основного метода, по умолчанию является потоком пользователя.

Метод setDaemon() может быть вызван только после Нить объект был создан и поток не был запущен. Попытка позвонить setDaemon() в то время как поток работает будет бросать НезаконныеThreadStateException :

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

5. Проверка, является ли нить темой Daemon

Наконец, чтобы проверить, является ли поток потоком деймона, мы можем просто назвать 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. Заключение

В этом быстром учебнике мы видели, что такое темы daemon и для чего они могут быть использованы в нескольких практических сценариях.

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