Подтвердить что ты не робот

Когда основной поток останавливается в Java?

Я прочитал это утверждение:

Основной поток должен быть последним, чтобы завершить выполнение. Когда основной поток останавливается, программа завершается.

Это правда?

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

Насколько я понимаю: при запуске программы JVM создает один поток для запуска вашей программы. JVM создает один пользовательский поток для запуска программы. Этот поток называется основной нитью. Основной метод класса вызывается из основного потока. Если программа генерирует новые потоки из основного потока, она останавливается до тех пор, пока последний нить не умрет.

Какая из них истинна?

4b9b3361

Ответ 1

Программа завершается, когда все не-демонные потоки умирают (поток демона - это поток, отмеченный setDaemon(true), обычно используемый для потоков приложений). Из javadoc:

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

  • Вызывается метод выхода класса Runtime, и менеджер безопасности разрешил операцию выхода.
  • Все потоки, которые не являются потоками демона, умерли, либо возвратившись из вызова метода запуска, либо выбросив исключение, которое распространяется за пределы метода run.

Ответ 2

Я прочитал это утверждение: "Основной поток должен быть последним потоком для завершения выполнения. Когда основной поток останавливается, программа завершается". Это правда?

Нет, это не так. Виртуальная машина завершается, если последний поток не-демона завершен. Это не должно быть основной нить.

Простой пример:

public static void main(String[] args) {

   System.out.println("Main thread started");
   new Thread(new Runnable() {
     @Override
     public void run() {
        System.out.println("Second thread started");
        try {
          Thread.sleep(2000);  // wait two seconds
        } catch(Exception e){}
        System.out.println("Second thread (almost) finished");
     }
   }).start();
   System.out.println("Main thread (almost) finished");
}

Ответ 3

Когда основной поток останавливается, программа завершается.

Программа завершает работу, когда больше не работает ниток, не содержащий daemon (или кто-то, называемый System.exit). Основной поток может быть закончен давно.

Ответ 4

JVM завершит выполнение, когда основной поток и все не-демонные потоки завершат выполнение.

Когда вы создаете новый поток, вы можете вызвать Thread.setDaemon(true), чтобы сделать его потоком демона. Если вы это сделаете, JVM не будет ждать завершения этого потока до его выполнения. Это полезно для любых создаваемых вами потоков, которые создаются для запуска в фоновом режиме до остановки программы.

Если вы создаете новый поток и не вызываете Thread.setDaemon(true), тогда JVM задерживает выход, пока этот поток не будет завершен, даже если основной поток завершен.

Ответ 5

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

проверить эту ссылку

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join%28%29

Ответ 6

Первое утверждение не является точным. Программа java завершается, когда все потоки не-daemon были завершены или когда вызывается System.exit() или Runtime.exit().

Thread прекращается, когда он выходит из своего метода run(). Основной поток является особенным, потому что вы явно не реализуете его метод run(), вместо этого вы реализуете main(), а main() вызывается из run(). Таким образом, основной поток прерывается, когда main() завершается.

Но основной поток не обязательно последний.

Ответ 7

Это из спецификации третьего варианта JVM, так что это самое актуальное из того, что я знаю:

5.7 Выход виртуальной машины

Виртуальная машина Java прекращает всю свою деятельность и выходит, когда:  • Все потоки, которые не являются потоками демона, завершаются. • Some thread вызывает метод выхода класса Runtime или класс System и  операция выхода разрешена менеджером безопасности.

Нет никакого различия в основном потоке, поэтому мы не должны предполагать, что это единственное, к чему оно относится.