Когда основной поток останавливается в Java? - PullRequest
27 голосов
/ 14 сентября 2011

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

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

Это правда?

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

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

Какой из них является правдой?

Ответы [ 7 ]

20 голосов
/ 14 сентября 2011

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

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

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

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

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

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

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 голосов
/ 14 сентября 2011

JVM завершит работу, когда основной поток и все потоки, не являющиеся демонами, завершат выполнение.

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

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

3 голосов
/ 14 сентября 2011

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

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

1 голос
/ 14 сентября 2011

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

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

Но основной поток не всегда является последним.

1 голос
/ 14 сентября 2011

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

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

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

0 голосов
/ 14 сентября 2011

Это из 3-го проекта спецификации JVM, так что это самый актуальный из известных мне:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...