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

Я прочитал это заявление:

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

Это правда?

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

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

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

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

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

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

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

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

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

 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"); } 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Где находится UIAlertView Live пока не уволен
  • Что было бы лучше для одновременных задач на node.js? Волwindows? Веб-рабочие? или Threads?
  • Когда мы должны использовать stream Java над Executor?
  • Простые числа Eratoshenes быстрее последовательны, чем одновременно?
  • Защита streamов std :: map для операций только для чтения
  • Являются ли Thread.stop и друзьями безопасными в Java?
  • Когда использовать volatile с многопоточным?
  • Как настроить тонкую пул streamов для фьючерсов?
  • Программное обнаружение тупика в java
  • Как CountDownLatch используется в многопоточности Java?
  • Параллелирование GDI + изменение размера .net
  • Interesting Posts

    Звук Realtek HD Audio с низким и плохим качеством после обновления Windows 10

    jquery Установка позиции курсора в контентном значении div

    Слушайте микрофон дистанционно

    Очень длинный процесс загрузки?

    Entity Framework 4.1 Атрибут InverseProperty и ForeignKey

    GridView связан с свойствами вложенного classа

    Как наследование работает для атрибутов?

    Разбор csv с использованием awk и игнорирование запятых внутри поля

    Самый быстрый способ закрепить реальное значение (фиксированная / плавающая точка)?

    Программно перемещаться с помощью реактивного маршрутизатора V4

    Получение ViewExpiredException в кластерной среде, в то время как метод сохранения состояния установлен на клиентский и пользовательский сеансы действителен

    Интернет через Ethernet: DNS работает, ping не работает (Windows работает, Linux не работает)

    Linq – левое соединение в нескольких (OR) условиях

    Разработка iPhone – настройка шрифта UIWebView

    Как создать исполняемый файл для оболочки Android

    Давайте будем гением компьютера.