2017-02-13 13 views
-2

Для создаваемой мной программы требуется массив объектов потока. Более конкретно, у меня есть класс, который расширяет Thread. Я делаю это так, чтобы каждый созданный новый объект работал в своем потоке. Если я хочу убить поток и удалить его из элемента массива, чтобы я мог создать новый объект Thread в этом пространстве, как это сделать? Это моя мысль.Как удалить объект Thread из массива?

Я понимаю, что удаление ссылки на поток фактически не остановит поток. Для этого мне сначала нужно было бы прервать поток. Чтобы удалить объект потока из массива, могу ли я просто сделать его нулевым? I.e .:

array[i].interrupt();  
array[i] = null; 

И тогда я смог бы создать новую тему в этом пространстве?

array[i] = new Thread(); 

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

+0

Что мешает вам попробовать? Прерывание - это не то же самое, что останавливаться. – f1sh

+0

Это должно работать, но чтобы остановить поток, прежде чем создавать новый, вы можете сделать массив [i] .join() перед установкой элемента в null. –

+0

Можете ли вы поделиться своими требованиями, зачем вам нужен массив объектов потоков? – marknorkin

ответ

0

Чтобы удалить объект потока из массива, я могу просто сделать его недействительным

Да. Это должно сделать ссылку, содержащуюся в позиции индекса i, чтобы указать на null. Однако, если вы устанавливаете элемент в индексной позиции i на null, а затем сразу же заявляете array[i] = new Thread();, вы можете пропустить шаг, на котором вы установили его на null, и вместо этого использовать только array[i] = new Thread();.

Также обратите внимание, что просто добавление элемента в массив не запустит вновь вставленный Thread. Вам все равно нужно позвонить array[i].start() после вставки нового Thread в массив, чтобы начать новый Thread.

Это говорит о том, что расширение от Thread имеет смысл только в том случае, если вы планируете переопределить некоторые функции из класса Thread. (Для этого я лично не вижу никакого действительного варианта использования). Вместо этого вы должны реализовать Runnable и передать его в конструктор Thread.