В этом doc указано, что JVM не останавливает процесс JAVA, если в процессе присутствуют потоки, не являющиеся демонами.
Когда запускается виртуальная машина Javaобычно существует единственный поток, не являющийся демоном (который обычно вызывает метод с именем main некоторого назначенного класса).Виртуальная машина Java продолжает выполнять потоки, пока не произойдет одно из следующих действий:
- Был вызван метод выхода класса Runtime, и диспетчер безопасности разрешил выполнение операции выхода.
- Все потоки, которые не являются потоками демонов, умерли, либо возвратившись из вызова метода run, либо выдав исключение, которое распространяется за пределы метода run.
Я проверил это с запуском автономных Thread
, ExecutorService
и NioEventLoopGroup
, и это работает, как указано выше.
Но для этого примера Netty Echo Server он сообщает после :
75 // Wait until the server socket is closed.
76 f.channel().closeFuture().sync();
Если я удаляю эту строку, код завершается дажехотя в процессе присутствуют нити-демоны.
Может кто-нибудь объяснить, почему?