В какой момент происходит удаление Thread из ThreadGroup

105
24 мая 2021, 20:30

В коде метода start у класса Thread, текущий поток добавляет себя в группу. На каком этапе объект Thread'а будет удален из группы и собран GC

Answer 1

В классе Thread есть приватный метод под названием exit() в его доке написано следующее:

/**
 * This method is called by the system to give a Thread
 * a chance to clean up before it actually exits.
 */
private void exit() {

при корректном завершении потока (если на процессе не был вызвал kill -9, например) будет вызван метод exit(). Я не могу сказать как узнать когда именно он будет вызван, но явно после того как завершится runnable, который ему передан и перед сменой статуса потока в TERMINATED. Как раз в этом методе, если thread принадлежит какой-либо группе, вызывается group.threadTerminated() (хотя он на самом деле еще не Terminated :)) у своей группы, тем самым удаляясь из нее.

Есть еще один вариант, когда идет удаление из группы - когда поток не смог создаться в недрах операционки по каким-либо причинам (тут стоит заметить, что при вызове конструктора создание потока на самом деле не происходит, поток создается лишь при вызове метода start()).

Thread, как и любой другой объект будет удален из памяти тогда, когда исчезнут все ссылки на него. Когда вы дергаете метод start() JVM запоминает ссылку. И потом после завершения потока чистит эту ссылку (при этом если вы сохранили к себе куда-то поток, то он так и будет висеть в памяти в состоянии Terminated). Если честно, то механику отслеживания потока внутри JVM я не знаю, но могу грубо предположить, что есть массив с запущенными потоками и каждый поток удаляет себя из этого массива перед завершением (это нужно для ожидания всех поток не демонов перед выходом). Уточню, что речь именно об объекте класса Thread. Поток, который выделяется операционной системой исчезнет как только закончится его исполняемый код (по-сути когда закончится метод run()).

А зачем вы вообще поинтересовались ThreadGroup? Еще Joshua Bloch в 2002 писал в Effective Java, что в своих приложениях незачем использовать ThreadGroup и ожиданий ThreadGroup не оправдал.

READ ALSO
Не запускается приложение после деплоя с гитом

Не запускается приложение после деплоя с гитом

Я новичок в nodejs, хочу запустить простой чат с помощью сервиса heroku и библиотеки socket

103
Как этот jQuery код выглядел бы на чистом javascript?

Как этот jQuery код выглядел бы на чистом javascript?

Здраствуйте! Пишу сайт по продаже косметики для портфолиоСам сайт написан полностью на чистом javascript

107