Должен ли я аннулировать прерванный поток?

#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, просто убедитесь, что вы не используете эту ссылочную переменную дальше в методе.