2014-08-30 2 views
0
public class MyClass extends Thread{ 
    public void run() { 

     try { 
      while(!Thread.currentThread().isInterrupted()) { 
      // ... 
      } 
     } catch (InterruptedException consumed) 
      /* Allow thread to exit */ 
     } 

    } 
    public void cancel() { interrupt(); } 

    //etc. 
} 

Должен ли я всегда вызывать cancel(), как это, прежде чем деконструировать объект по какой-либо причине, или я не должен беспокоиться об этом?Что происходит с «потоком объекта», расширяющим Thread, если объект больше не упоминается?

+4

Определить _deconstructing_. –

+0

Если поток работает, он доступен GC. Я не понимаю, на какой вопрос вы пытаетесь спросить. – tmyklebu

+0

Декомпозиция: избавление от ссылок на объекты ... –

ответ

3

Подвижная нить и соответствующий ей объект Thread, является GC root. Поэтому он не подходит для сбора мусора.

Если вы хотите GC-объект Thread работающей нити, этот поток необходимо будет остановить. Если вы правильно внедрили механизм прерывания, вам понадобится interrupt вашей нитью с помощью вашего метода cancel(). Когда поток возвращается из своего метода run(), он завершается и больше не является корнем GC. Если у вас больше нет ссылок на живые ссылки на его объект Thread, это будет сбор мусора.