Это плохо для Java-приложения, чтобы закрыть, когда отдельный поток спит? - PullRequest
5 голосов
/ 08 февраля 2011

Например, если у меня есть программа командной строки Java, которая порождает новый поток (поток № 2), чтобы выполнить опрос, а затем спать в течение 5 минут. в то время как основной поток (поток # 1) программы работает, а затем завершается до истечения 5 минут из потока # 2, поэтому программа завершается. Есть ли проблемы с этим? Должен ли я прервать поток № 2 в поток № 1 до конца основной функции в этой программе?

Ответы [ 4 ]

2 голосов
/ 08 февраля 2011

Это может считаться плохой практикой и признаком плохого дизайна, но в принципе не должно быть никаких проблем для завершения JVM с System.exit. Нет, если нет темы очистки, выполняемой потоком № 2.

Другая проблема заключается в том, может ли поток № 2 находиться в середине какого-либо действия.

0 голосов
/ 08 февраля 2011

Взгляните на здесь .

Для завершения java-программы необходимо, чтобы все потоки, не являющиеся демонами, сначала завершили работу.
Как только все потоки, не являющиеся демонами, остановят свое выполнение, JVM завершит работу всех потоков демонов.и, таким образом, отключится.

В вашем случае не должно быть никаких проблем, если только и до тех пор, пока ваш Thread #2 не выполнит какую-то важную функцию, такую ​​как обработка ресурсов.

0 голосов
/ 08 февраля 2011

Потоки не-deamon продолжают работать в фоновом режиме после того, как main завершил выполнение.
В результате вы будете иметь нисходящие потоки, если вы не явно вызовите System.exit, который убивает все потоки.
Однако лучшим подходом было бы остановить поток # 2.
Просто используйте флаг статуса, например boolean die в теме # 2.
Поток № 1 прервет поток № 2, затем поток № 2 увидит флаг die (установленный потоком № 1), установленный в true, выполнит любую необходимую очистку и завершит работу корректно.
В вашем случае этот поток № 2 просто спит в течение 5 минут и ничего не делает, все будет хорошо.

0 голосов
/ 08 февраля 2011

Это полностью зависит от того, что он делает.Когда программа завершается, процесс завершается, принимая с собой все дополнительные потоки.Единственная потенциальная проблема была бы, если бы поток № 2 содержал некоторый дескриптор ресурса.Однако, если все, что он делает, это чтение, то у вас не должно быть проблем.

...