2010-09-28 13 views
9

Powiedzmy, że odradzam wątek co kilka sekund, używając poniższej metody, a każda nić zajmuje około sekundy. Czy ukończone wątki zostaną usunięte?Czy wątki java zostaną usunięte po zakończeniu

new Thread (new myRunnableClass()).start(); 
+2

Jeśli proces jest tak prosty jak Twój przykład, a każdy wątek jest gwarantowany do zakończenia przed następnym uruchomieniem, czy możesz ponownie użyć jednego wątku? Zgaduję, że twój rzeczywisty program jest bardziej skomplikowany, ale po prostu rzucam sugestię tam. –

+0

@musicfreak: Wiesz, po prostu wychowałeś bardzo przerażający punkt. Z jakiegoś powodu robiłem to w innych miejscach i myślę, że ta sytuacja wyglądała trochę inaczej, ale wymyśliłem sposób na zastosowanie tej techniki do mojego problemu. Dzięki! – Dave

Odpowiedz

6

Natywny wątek na poziomie systemu operacyjnego jest uwalniany, gdy tylko wątek się zakończy (około run()), ale obiekt wątku będzie się zachowywał, jak każdy inny obiekt, dopóki nie stanie się niedostępny, a moduł do zbierania śmieci będzie działał.

Edit: Może też być interesujące wiedzieć, że Thread (w Sun wdrożenie Oracle, Anywho) ma prywatną metodę zwaną przez VM Po wyjściu gwint, który agresywnie null kilku dziedzinach, w tym jeden krajowy do zestawu Runnable ustawionego przez konstruktora Thread(Runnable). Więc nawet jeśli zachowujesz odniesienie do Thread, rzeczy, których nie potrzebuje po zakończeniu wykonywania zostaną zwolnione, niezależnie.

5

Nie nazwałbym tego usuniętym. Gdy wątek zostanie ukończony, przejdzie do stanu martwego, przygotowując się do usunięcia śmieci przez maszynę JVM.

+3

... chyba że jakaś inna "żywa" struktura danych zachowuje odniesienie do obiektu wątku. Na przykładzie przedstawionym w PO, który nie byłby problemem. – Pointy

+1

... ale jest to wzorzec, który nie występuje, gdy chcesz "dołączyć()" wątki, na przykład, aby pobrać niektóre wyniki z 'Runnable', ale znowu, nie możesz tego zrobić w twoim przykładzie, ponieważ' Odnośnik Runnable' został utracony. – jbindel

2

Tarło nowego wątku to dość kosztowny proces. To, czego chcesz, to pula wątków. Można to zmienić na różne sposoby - here's one.

+3

Wątki do tarła * były * drogie w systemach * nix (* mianowicie Linux *) dawno temu, ale w jądrze 2.4 (* czy było to 2.6? *) Zmienili system wątków, tak że tworzenie nowych wątków jest teraz praktycznie bezpłatne. Zwróć uwagę, że w środowiskach Windows tarowanie wątków zawsze było dość tanie. To powiedziawszy, używanie puli wątków jest mądrą rzeczą, ponieważ w naturalny sposób zawsze jest trochę narzutów i rzadko trzeba naprawdę mieć miliard uruchomionych wątków, gdy zrobi to kilkanaście. – Esko

Powiązane problemy