2013-05-07 9 views
10

od main() działa na wątku. i tak szybko, jak kończy się main(), główny wątek powinien się zatrzymać. Więc jeśli main() wywołał długo działający wątek, który jeszcze się nie zakończył, nawet po tym, jak main() wykonał wszystkie zadania. Ponieważ zostanie zwrócone main(), czy pozostałe wątki zostaną usunięte? wydaje mi się że nie. ale dlaczego?, jeśli główna metoda kończy wykonywanie, co dzieje się z długim wątkiem?

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

JVM kończy działanie tylko po zakończeniu wszystkich wątków innych niż demonów. Więc tak, twój program zakończy działanie po zakończeniu długiego zadania. – assylias

Odpowiedz

7

proces zostanie zakończony, gdy nie ma więcej wątków niż demon zabijające wszystkie wątki demon, jeśli jest to konieczne. Jeśli jednak masz do mają żadnych wątków nie-demona, te będą uniemożliwić zakończenie procesu.

Z Thread.setDaemon:

towarowe wątek albo jako nici wątku demon lub użytkownika. Wirtualna maszyna języka Java wychodzi, gdy jedynymi uruchomionymi wątkami są wszystkie wątki demona.

Ta metoda musi zostać wywołana przed uruchomieniem wątku.

I od section 12.8 of the JLS:

Program kończy całą swoją działalność i wyjść, kiedy jedna z dwóch rzeczy się dzieje:

  • Wszystkie wątki, które nie są demona wątki zakończyć.

  • Niektóre wątki wywołują metodę zakończenia klasy Środowisko wykonawcze lub klasy System, a operacja wyjścia nie jest zabroniona przez menedżera zabezpieczeń.

+0

W powiązanej notatce, w jakim stanie byłby wtedy główny wątek? ponieważ jego wykonanie jest zakończone, ale inne wątki uniemożliwiają jego zatrzymanie. – Ankit

+1

@Ankit: Nie, inne wątki uniemożliwiają * zakończenie procesu *. Główny wątek został ukończony i już nie istnieje. Ale proces nadal działa, ponieważ istnieją inne wątki na pierwszym planie. –

1

jeśli długa nić nie jest wątek demon, to nie zostanie zakończone po głównych wyjść gwintu. JVM kontynuuje uruchamianie wątków do czasu wywołania metody wyjścia Runtime (i zezwolenia na uruchomienie) lub do utraty wszystkich wątków innych niż demony. Jeśli twój długotrwały wątek nie jest wątkiem demona, JVM nie zakończy pracy (tzn. Wątek będzie nadal dostępny do uruchomienia).

+0

Właśnie widziałem post powyżej Jon - sugerowałbym, żebyś użył tego jako odpowiedzi. –

1

Aby odpowiedzieć na pytanie dlaczego, ponieważ tworzenie wątku jako wątku innego niż demon oznacza, że ​​nie chcesz go nagle przerwać, chcesz go zakończyć w uporządkowany sposób, uruchamiając do zakończenia lub przez anulowanie. Jeśli twój wątek został zabity przez maszynę JVM, gdy główny został opuszczony, byłby równoważny z uczynieniem wątku demonem.

Powiązane problemy