Потоки демонов в Java

Потоки демонов в Java

1. обзор

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

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

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

Пользовательские потоки являются приоритетными. The JVM will wait for any user thread to complete its task before terminating it.с

С другой стороны,daemon threads are low-priority threads whose only role is to provide services to user threads.

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

Вот почему бесконечные циклы, которые обычно существуют в потоках демонов, не вызовут проблем, потому что любой код, включая блокиfinally, не будет выполняться после того, как все пользовательские потоки завершат свое выполнение. По этой причинеdaemon threads are not recommended for I/O tasks.

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

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

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

4. Создание потока демона

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

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

Any thread inherits the daemon status of the thread that created it. Поскольку основной поток является пользовательским потоком, любой поток, созданный внутри основного метода, по умолчанию является пользовательским потоком.

Метод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. Заключение

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

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