2012-01-03 4 views
3

Я запутался в потоках daemon. На большинстве сайтов написано, что он завершается, когда приложение остановлено, но что делать, если приложение работает непрерывно.Демон-поток в java

+0

Если этот поток запущен, и я использую его в веб-приложении, это остановит серверный эффект? – Rookie

ответ

7

... но что делать, если приложение работает непрерывно.

Затем поток демона просто продолжает работать.

(Это предполагает, что нить в вопросе не выходит из своего метода run(), или умирают в результате неперехваченного исключения.)


Точка маркировки нити как «демон» является чтобы сообщить JVM, что нет необходимости ждать завершения потока до начала выключения. (Другой подход к закрытию, чтобы иметь какой-нить вызова System.exit(). Это инициирует отключение, даже если есть и другие не-демон тема.)


Followup

У меня есть приложение, постоянно работает под сервером tomcat, и я понял из комментариев, что созданный поток демона не остановится, поскольку приложение не останавливается, но что, если мы попытаемся остановить сервер tomcat напрямую, это создаст утечки памяти?

Если вы остановите webapp (но не сервер tomcat), то поток демона будет продолжать работать. Если вы хотите, чтобы потоки, созданные вашим веб-браузером, ушли, вам необходимо запрограммировать ваш webapp для прослушивания соответствующих событий контекста и прерывания (или любого другого) потоков, чтобы заставить их отключиться.

Если вы закрыли кот, то все уходит, включая демон резьб:

  1. Когда вы успешно остановить сервер Tomcat (например, «catalina.sh остановка»), то выходит JVM и все потоки (демона или иначе) умереть.

  2. Запуск «catalina.sh stop» может сбой, но простое существование нити демона не приведет к сбою.

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

  3. Если вы запустили «catalina.sh stop -force», то экземпляр tomcat будет убит, если он не работает в течение 5 секунд; см. «helpina.sh help» или источник сценария.

Когда вы выключаете и перезапускаете tomcat, то утечки потока и утечки памяти являются спорными. Действительно, это классическое решение для утечек.

+0

Если этот поток запущен, и я использую его в веб-приложении, это остановит серверный эффект? – Rookie

+2

@raghav - это зависит от того, что вы подразумеваете под «остановкой сервера». Если вы вызываете JVM для выхода, то, естественно, любые потоки демона (или не-демона) будут убиты. –

+0

Я имею в виду, если этот поток демона работает под сервером tomcat в приложении, которое работает непрерывно. Как сервер справится с этим.? Будет ли утечка памяти, если мы попытаемся остановить этот сервер? – Rookie

2

Ничья демона прекращается, когда возвращается его метод выполнения, или когда в JVM больше нет потока без демона. Если поток non-daemon работает навсегда, а метод запуска потока демона никогда не возвращается, то поток демона также работает вечно.

+0

Не прекращается ли поток не-демона, когда заканчивается его метод запуска? Насколько я понимаю, поток демона будет прекращен, когда приложение закончится. –

+1

Err, да, это мой ответ. –

+0

Метод возврата void вернется в конце его выполнения кода, правильно? – Delfic

5

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

Для уточнения:

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) опущен, программа НЕ будет завершена.

Смежные вопросы