Если основной метод завершает выполнение, что происходит с любым длинным потоком?

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

public static void main(String[] s){    
    new LongRunningThread().start();
}

Ответ 1

Процесс завершится, если нет потоков не-демона, при необходимости уничтожьте любые потоки демона. Однако, если у вас есть какие-то не-демонные потоки, это предотвратит завершение процесса.

От Thread.setDaemon:

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

Этот метод должен быть вызван до начала потока.

И из раздела 12.8 JLS:

Программа завершает всю свою деятельность и выходит, когда происходит одна из двух вещей:

  • Все потоки, которые не являются потоками демона, завершаются.

  • В некотором потоке вызывается метод exit класса Runtime или класс System, а операция выхода не запрещена менеджером безопасности.

Ответ 2

если ваш длинный поток не является потоком демона, он не будет завершен после выхода основного потока. JVM продолжает запускать потоки до тех пор, пока не будет выведен метод выхода из Runtime (и разрешен для запуска) или все потоки не-демона. Если ваш длинный поток не является потоком демона, JVM не выйдет (т.е. Поток будет доступен для работы).

Ответ 3

Чтобы ответить на ваш вопрос, почему это потому, что поток в потоке не-демона означает, что вы не хотите, чтобы он был прекращен внезапно, вы хотите, чтобы он был завершен упорядоченным способом, выполнив его до завершения или отменив, Если ваш поток был убит JVM, когда был выведен основной объект, что эквивалентно тому, чтобы поток был демоном.