Завершает ли удаление элемента из списка класса runnable его поток?

Я пишу чат-сервер на Java. Я использовал фиксированный массив исполняемых классов, где каждый элемент массива представляет клиента. Создаваемые потоки находятся в бесконечном цикле, который считывается из потока сокетов.

Теперь я хочу сделать это со списком, поэтому мне не нужно беспокоиться о размере массива, и это звучит более законно. Однако я не мог быть уверен, что удаление элемента также завершает поток. На самом деле я понятия не имею, что он делает. Кроме того, мне интересно, есть ли другие возможные проблемы с использованием списка в такой ситуации. Наконец, как насчет массива Timer? Поскольку я использовал таймер для каждого клиента, опять же, удаление таймера из списка таймеров также останавливает его расписание? Возможные проблемы?


person theGD    schedule 12.08.2012    source источник


Ответы (4)


Привет, я обращусь к этому вопросу!

Если поток запущен, он не будет собирать мусор, поскольку на него ссылается содержащий поток.

Будет собран мусор, если это уже сделано или еще не запущено!

Причина этого в том, что при запуске объект-поток добавляется к текущему ThreadGroup (немного сложнее под капотом :)), а когда это делается, он автоматически удаляется.

person mo.    schedule 12.08.2012

Объект существует сам по себе — сохранение ссылки на этот объект в списке не меняет его поведения.

Поэтому, если у вас есть задача Runnable, которая выполняется в потоке, добавление ее в список/удаление из списка не имеет значения для этой задачи Runnable, и поток продолжит ее выполнение.

То же самое относится к таймеру и любым другим объектам.

Примечание: есть одна ситуация, когда удаление объекта из списка может иметь значение: если этот объект доступен только через этот список. После удаления, поскольку он больше недоступен, он становится пригодным для сборки мусора. Но это не относится к работающему потоку или активному таймеру.

person assylias    schedule 12.08.2012

У вас есть объект потока. Ссылка на него была вставлена ​​в массив. Добавление или удаление ссылки из массива (то есть потока) не вызовет каких-либо неизвестных побочных эффектов, так что все в порядке. Если вы хотите остановить поток, вам придется реализовать это либо внутри вашего метода run. Вывоз мусора здесь не при чем.

Таймер снова та же проблема: все они являются ссылками на объекты.

person Miquel    schedule 12.08.2012

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

person Vitaliy    schedule 12.08.2012