Зачем использовать потоки не-демонов в Java? - PullRequest
4 голосов
/ 11 января 2012

Кажется, что потоки демона всегда лучше - потому что они будут остановлены виртуальной машиной после выхода из основного потока приложения.Существуют ли другие причины для использования потоков, не являющихся демонами, кроме случаев, когда невозможно прервать какую-либо операцию?Спасибо.

Ответы [ 5 ]

6 голосов
/ 11 января 2012

Когда вы пишете сервер (например, контейнер сервлета), все, что вам нужно main, - это запускать и запускать потоки прослушивателя HTTP, принимать потоки, потоки сканирования файловой системы, потоки RMI и т. Д.

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

Даже в Swing (настольное программирование) единственным требованием для main является инициализация главного окна (JFrame). Остальное происходит в потоках слушателя Swing (EDT) и различных фоновых потоках.

4 голосов
/ 11 января 2012

Главное отличие в том, как выходят потоки демонов; JVM просто останавливает их.

  • finally блоки не выполнены
  • стеки не разматываются

Вы не хотите использовать потоки демона для вещей, которые необходимо оставить в известном состоянии, таких как файловый ввод / вывод, транзакции базы данных и т. Д.

4 голосов
/ 11 января 2012

Фактически, любой поток, который должен завершаться естественным образом (оставляя свой метод "run"), должен не быть потоком демона, поскольку вы не хотите, чтобы JVM завершала работу, пока они выполняют свою работу.

Это относится ко всем потокам, которые вы запускаете и ожидаете естественного завершения.

Как правило, потоки демонов являются исключением, а не правилом.

2 голосов
/ 11 января 2012

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

Если вы хотите выйти при выходе из основного потока, вы можете вызвать System.exit (). Многие приложения не сохраняют свой основной поток, и вся работа выполняется в потоках, которые он запускает.

1 голос
/ 11 января 2012

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

Если вам нужен больший контроль над тем, когда поток безопасен, не делайте егодемон.

...