У меня есть реализация Java ThreadFactory, порождающая объекты подкласса исполняемых потоков в моем приложении для Android. Это приложение требует, чтобы все порожденные потоки были адресуемыми до того, как сработает определенное событие, и чтобы после срабатывания указанного события порожденные потоки могли стать пригодными для сборки мусора (например, счетчик ссылок равен 0). Я думал, что для удовлетворения первого требования я просто буду поддерживать ArrayList моих объектов потока, и это прекрасно работает. Проблема связана со вторым требованием и привела меня к ряду вопросов, касающихся подсчета ссылок Java:
Вопрос 1. Увеличивает ли простое сохранение ссылок на порожденные потоки в ArrayList или другом контейнере счетчик ссылок каждого объекта потока? Каким был бы счетчик ссылок каждого объекта потока, если бы я никогда не сохранял их, а вместо этого позволял своей фабрике создавать их и запускать без какого-либо определенного дескриптора, как показано ниже?
mvThreadSource.newThread(new BackgroundThread(...)).run();
Вопрос 2. Делает ли приведенный ниже пример кода что-либо с фактическим объектом потока, на который указывает hTempThread, кроме увеличения и немедленного уменьшения его счетчика ссылок?
BackgroundThread hTempThread;
for(int i=0;i<mvThreadsVector.size();i++){
hTempThread = mvThreadsVector.get(i); //probably increments ref count of thread
hTempThread = null; //probably just decrements the ref count of thread back to
//previous value
}
Вопрос 3. Предполагая, что ответ на вопрос 2 «нет», каким будет эффективный способ хранения потоков, порожденных реализацией ThreadFactory, чтобы их счетчики ссылок можно было уменьшить до 0 по требованию? Каким будет правильный синтаксис при удалении этих ссылок? Будет ли приведенный ниже пример кода эффективно уменьшать количество ссылок на все задействованные объекты (mvThreadsVector, tempThreads, каждый объект потока, отслеживаемый mvThreadsVector) до 0? Что именно делает clear() со счетчиками ссылок на объекты, хранящиеся в массиве массивов, и что установка ссылки на массив в null делает со счетчиками ссылок на элементы, хранящиеся внутри (если вообще есть)?
Object[] tempThreads = mvThreadsVector.toArray();
mvThreadsVector.clear(); //possible this line is all I need...
mvThreadsVector = null;
for(int i=0;i<tempThreads.length;i++){
tempThreads[i] = null;
}
tempThreads = null;
Любая помощь с любым/всеми вышеперечисленными вопросами будет очень признательна!