/ / Destroying Threads in Java - java, wielowątkowość, threadpool

Niszczenie wątków w Javie - java, wielowątkowość, threadpool

Widziałem kilka postów na stackoverflow i przeczytałem samouczki, które wyrocznia opublikowała na temat niszczenia wątków. Z tego co rozumiem, raz ty start() wątku, którego nie możesz użyć stop() usunąć ten wątek. Zamiast usuwać wątek z programu planującego, zaleca się utworzenie wątku sleep() w sposób nieokreślony. Czy to prawda?

Również to prowadzi mnie do następnego pytania, dlaczego ludzie używają thread pools?. Zamiast „spać” wątek, bardziej zaradne jest używanie tego wątku do pracy nad innymi zadaniami niż tworzenie nowych wątków. Daj mi znać, jeśli rozumiem multi-thread zarządzanie ma rację. Nie ma sensu, że Java nie pozwala na thread całkowicie usunięte w bezpieczny sposób.

Odpowiedzi:

3 dla odpowiedzi № 1

Ogólnie uważa się to za bardzo zły pomysłwymuszenie zatrzymania wątku po jego uruchomieniu (lub w celu uśpienia go na czas nieokreślony), ponieważ wątek nie będzie w stanie wyczyścić żadnych zasobów, które nabył. Na przykład, jeśli wątek nabył blokadę i został siłą zabity lub spał w nieskończoność, blokada nie zostanie zwolniona i może dojść do zakleszczenia. Podobnie, jeśli wątek wprowadzał zmiany w strukturze danych i zabijał wcześnie, struktura danych może być w stanie uszkodzonym, powodując później poważne problemy.

Najlepszym sposobem na zatrzymanie wątku w Javie jestprzerwij wątek i powiedz, że musi spróbować zamknąć go tak szybko, jak to możliwe. W ten sposób wątek może spróbować zatrzymać to, co robi, i zwolnić wszystkie zasoby przed zamknięciem. Innymi słowy, ty żądanie że wątek się zamknął, a nie przymusowo go zabił.

Nie ma to związku z tym, dlaczego istnieją pule wątków. Pule wątków są użyteczne, ponieważ tworzenie lub niszczenie wątków zwykle wiąże się z pewnym obciążeniem, ze względu na wewnętrzną księgowość JVM lub OS wymaganą do śledzenia stanu wątku i postępu. Pule wątków umożliwiają recykling wątków i ich wykonywanie różne zadania polegające na uśpieniu wątków, dopóki zadanie nie jest gotowe, a następnie obudź się i wykonaj zadanie.Może to być znacznie szybsze niż pojawienie się nowego wątku, samodzielne wykonanie zadania, a następnie zerwanie wątku.

Mam nadzieję że to pomoże!


1 dla odpowiedzi nr 2

Jak wspomniano o templatetypedef, nie powinieneś byćprzymusowo zatrzymując wątek, powinieneś zasygnalizować wątkowi, aby się zatrzymał. Na przykład za każdym razem, gdy twój wątek blokuje się, należy to zrobić w pętli while, która sprawdza warunek, na którym się blokuje, a także warunek wyjścia:

while (!condition && !stop) {
try {
someBlockingFunction(); // A lock, take on a BlockingQueue, etc.
} catch (InterruptedException e) { //ignored }
}

Po wyjściu z pętli while sprawdź, czy zostaliśmy zasygnalizowani, aby zatrzymać (stop = true) przez inny wątek, jeśli tak, wróć z run() funkcja pozwalająca na czyszczenie nici.