Я запутался в потоках daemon. На большинстве сайтов написано, что он завершается, когда приложение остановлено, но что делать, если приложение работает непрерывно.Демон-поток в java
ответ
... но что делать, если приложение работает непрерывно.
Затем поток демона просто продолжает работать.
(Это предполагает, что нить в вопросе не выходит из своего метода run()
, или умирают в результате неперехваченного исключения.)
Точка маркировки нити как «демон» является чтобы сообщить JVM, что нет необходимости ждать завершения потока до начала выключения. (Другой подход к закрытию, чтобы иметь какой-нить вызова System.exit()
. Это инициирует отключение, даже если есть и другие не-демон тема.)
Followup
У меня есть приложение, постоянно работает под сервером tomcat, и я понял из комментариев, что созданный поток демона не остановится, поскольку приложение не останавливается, но что, если мы попытаемся остановить сервер tomcat напрямую, это создаст утечки памяти?
Если вы остановите webapp (но не сервер tomcat), то поток демона будет продолжать работать. Если вы хотите, чтобы потоки, созданные вашим веб-браузером, ушли, вам необходимо запрограммировать ваш webapp для прослушивания соответствующих событий контекста и прерывания (или любого другого) потоков, чтобы заставить их отключиться.
Если вы закрыли кот, то все уходит, включая демон резьб:
Когда вы успешно остановить сервер Tomcat (например, «catalina.sh остановка»), то выходит JVM и все потоки (демона или иначе) умереть.
Запуск «catalina.sh stop» может сбой, но простое существование нити демона не приведет к сбою.
Невозможность остановки может быть связана с тем, что некоторые веб-серверы застревают в обработке событий выключения, или это может быть связано с тем, что сервер tomcat находится в состоянии зависания или нечувствительности.По крайней мере, в некоторых версиях Tomcat существование потока без демона является достаточным для того, чтобы выключение завершилось неудачей.)
Если вы запустили «catalina.sh stop -force», то экземпляр tomcat будет убит, если он не работает в течение 5 секунд; см. «helpina.sh help» или источник сценария.
Когда вы выключаете и перезапускаете tomcat, то утечки потока и утечки памяти являются спорными. Действительно, это классическое решение для утечек.
Если этот поток запущен, и я использую его в веб-приложении, это остановит серверный эффект? – Rookie
@raghav - это зависит от того, что вы подразумеваете под «остановкой сервера». Если вы вызываете JVM для выхода, то, естественно, любые потоки демона (или не-демона) будут убиты. –
Я имею в виду, если этот поток демона работает под сервером tomcat в приложении, которое работает непрерывно. Как сервер справится с этим.? Будет ли утечка памяти, если мы попытаемся остановить этот сервер? – Rookie
Ничья демона прекращается, когда возвращается его метод выполнения, или когда в JVM больше нет потока без демона. Если поток non-daemon работает навсегда, а метод запуска потока демона никогда не возвращается, то поток демона также работает вечно.
Не прекращается ли поток не-демона, когда заканчивается его метод запуска? Насколько я понимаю, поток демона будет прекращен, когда приложение закончится. –
Err, да, это мой ответ. –
Метод возврата void вернется в конце его выполнения кода, правильно? – Delfic
Исправить. Приложение будет завершено только после завершения всех потоков, не связанных с демонами. Это не выполняется для потоков демона.
Для уточнения:
public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
while (true) {
// do something...
}
}
}
thread.setDaemon(true);
thread.start();
}
выше будет немедленно выйти. Однако, если thread.setDaemon (true) опущен, программа НЕ будет завершена.
- 1. java beans в java
- 2. Реализация Java в Java
- 3. Аргументы Java в java -ORBInitialPort
- 4. Чтение файла .java в Java
- 5. конкатенировать файлы .java в java
- 6. parse java string в java
- 7. Java NullPointerException в Java-агенте
- 8. Java Multiple Comparision в Java
- 9. Как вычислить использование java-процесса в java-процессе в java
- 10. Преобразование .java в .class в java-программе
- 11. Своп-строки в Java. Новичок в Java
- 12. в Java
- 13. Интерпретация Java-кода в Java-приложении - как запустить Java-код в java-программе
- 14. Java error- Java не может загрузить в виртуальной машине Java
- 15. Как импортировать java-класс из библиотеки java в код java
- 16. Java: Разбор JSON отформатированные строки в Java
- 17. В чем разница между **/*. Java и * .java?
- 18. Преобразование последовательного Java в параллельный Java-код
- 19. java package vs System в JAVA
- 20. Java - есть ли раковина в Java
- 21. Java-анализатор исходного кода Java в Ruby
- 22. скомпилировать java в другом пути от java
- 23. Запись непрерывной петли для java в java
- 24. Groovy, встроенный в Java, перезвонив на Java
- 25. запустить программу scala в java-файле java
- 26. Преобразование Java 8 в Java 1.5
- 27. Java Installed vs Java Включено в браузере
- 28. Java Servlet диспетчеру в другой файл Java
- 29. Java-интерпретатор или компилятор в java
- 30. Java: подсчет вхождения в массив java
Если этот поток запущен, и я использую его в веб-приложении, это остановит серверный эффект? – Rookie