— Вот тебе новая и интересная тема.
Оказывается, нити можно запускать в различных режимах.
Работа обычной программы, состоящей из одной нити, завершается вместе с работой главной нити. После этого Java-машина освобождает память программы.
Когда мы запускаем дочернюю нить, программа продолжает работать, даже если главная нить завершилась. Java-машина не закрывает программу, пока есть хотя бы одна работающая нить.
Так вот, в больших программах часто есть так называемые «служебные процессы» — это нити, работа которых состоит в обслуживании других частей программы. Сами по себе они не нужны. Например: процесс удаления неиспользуемых объектов (сборка мусора), логирование состояния памяти и ошибок, различные отчеты о текущем состоянии программы и т.д. и т.п.
Такие служебные процессы нужны, когда программа что-то делает, но не нужны сами по себе.
— Да, я это понял.
— Java позволяет запустить нить в «режиме демона» (daemon). Работа такой нити ничем не отличается от других, но если в программе все обычные нити завершили работу, но остались только нити-демоны — Java-машина завершит программу.
— Т.е. мы объявляем нить «служебной», и она просто не учитывается при закрытии программы и все?
— Э-э-э. Ну, ты и выдал – кратко и по существу. Собственно, я это и хотела тебе сказать.
— Краткость – сестра таланта. А талантливые роботы – талантливы во всем.
— Есть вопросы?
— Что нужно, чтобы запустить нить в режиме демона? Унаследоваться от какой-нибудь DaemonThread?
— Нет, все гораздо проще – у класса Thread есть метод setDaemon(boolean), надо передать в него true и все. Только вызвать его нужно до вызова метода start(), пока реальная нить не создана. Поменять тип уже запущенной нити невозможно.
Thread thread = new LoggerThread();
thread.setDaemon(true);
thread.start();
— И это все?
— Да.
Хочу еще раз обратить твое внимание на процесс создания и запуска нити.
Когда мы создаем объект типа Thread, нить при этом еще не создается. Thread – это не нить, нить создаст сама Java-машина, когда будет вызван метод start(). А Thread — это специальный объект Java-машины, который позволяет получать информацию о нити и немного управлять ей.
— Ясно. Спасибо, Элли.