Что предотвращает Поток в C# от того, чтобы быть собранным?

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

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

14
задан Wai Ha Lee 2 December 2015 в 10:35
поделиться

6 ответов

Время выполнения сохраняет ссылку на поток, пока это работает. Привычка GC собирает его, пока любой все еще сохраняет ту ссылку.

14
ответ дан 1 December 2019 в 13:10
поделиться

Это - зашитая функция сборщика "мусора". Рабочие потоки не собраны.

2
ответ дан 1 December 2019 в 13:10
поделиться

Это зависит от того, работает ли поток или нет. Если Вы просто создали Поток, возражают и не запустил его, это - обычный управляемый объект, т.е. имеющий право на GC. Как только Вы запускаете поток, или когда Вы получаете объект Потока для того, чтобы уже выполнить поток (GetCurrentThread), он несколько отличается. "Выставленный объект", управляемый Поток, теперь держатся сильная ссылка в CLR, таким образом, Вы всегда получаете тот же экземпляр. Когда поток завершается, эта сильная ссылка выпущена, и управляемый объект будет собран, как только у Вас нет никаких других ссылок на (теперь мертвыми) Поток.

7
ответ дан 1 December 2019 в 13:10
поделиться

Важный момент для замечания, хотя - если поток отмечен с IsBackground=True, он не будет препятствовать тому, чтобы целый процесс вышел

0
ответ дан 1 December 2019 в 13:10
поделиться

Ну, безопасно предположить что, если поток работает куда-нибудь, что что-то имеет ссылку на него так разве, которой не было бы достаточно для остановки сборки "мусора"?

0
ответ дан 1 December 2019 в 13:10
поделиться

Присвоить новый поток локальному полю?

class YourClass
{
  Thread thread;

  void Start()
  {
    thread = new Thread(Foo);
    thread.Start();
    GC.Collect();
  }
}

Сборка "мусора" собирает все, что не является ссылками, таким образом, в Вашем коде нет никакой ссылки поля/переменной против потока, таким образом, это будет собрано.

-3
ответ дан 1 December 2019 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: