#java
#java
Вопрос:
Я создал поток, подобный этому:
private Thread t = new Thread() {
@Override
public void run() {
try {
while(true) {
// do work
Thread.sleep(1000);
}
} catch (InterruptedException ex) {
}
}
};
t.start();
Затем я прервал его с помощью t.interrupt()
.
Как только поток остановится и перейдет в режим сна (), он прервется и станет непригодным для использования, но останется ли он в памяти?
Должен ли я вызывать t = null
, или GC позаботится об этом?
Я пытаюсь динамически прерывать поток и воссоздавать его при необходимости (используя t = new Thread()
), но я не уверен, удаляет ли just interrupt() старый поток из памяти. Я искал, но не смог найти этот конкретный ответ.
Комментарии:
1.
interrupt()
только сообщает потоку, что он был прерван, никакой «черной магии».
Ответ №1:
Класс Thread является прокси для потока операционной системы. Перед вызовом start() фактического потока операционной системы нет, и после остановки потока он очищается, даже если вы удерживаете объект Thread . На данный момент это так же, как и любой другой объект, и он будет очищен обычным способом.
Ответ №2:
Кажется, вы используете этот фрагмент кода внутри метода, поэтому поток t становится локальной переменной, и он будет очищен gc, просто убедитесь, что вы не используете эту ссылочную переменную дальше в методе.