2012-05-18 2 views
3
public class ThreadState { 

    public static void main(String[] args){ 
      Thread t = new Thread(){ 
      public void run(){ 
         // infinite loop 
         while (true) { 
         try { 

         Thread.sleep(1000); 
         } 
         catch (InterruptedException e) { 
         } 

         System.out.println("thread is running..."+Thread.currentThread().toString()); 
         } 

      } 
     }; 
     t.start() ; 
     t = null ; 
     while (true) { 
       try { 

       Thread.sleep(3000); 
       } 
       catch (InterruptedException e) { 
       } 
       System.out.println("thread is running..."+Thread.currentThread().toString()); 
     } 

    } 
} 

Образец экземпляра t инициализирован нулем .. все же он способен запускать и печатать свои детали на консоли. Нужно пояснить этоТема, инициализированная нулем в java

+0

Будет ли строка 't = null;' иметь какое-либо отношение к ней? – Makoto

+0

Вы устанавливаете значение null после его запуска. В чем проблема? – jn1kk

+0

Я думаю, t = null должен влиять на выполнение потока. поскольку нить не имеет ссылки, она должна дать какое-то исключение .. и это то, о чем я сомневаюсь. если я думаю, что я ошибаюсь, то вы можете заставить меня понять –

ответ

10

Thread экземпляр Т обнуляются

Нет, Threadпеременная устанавливается иметь нулевое значение. Переменные не являются экземплярами - стоит сделать абсолютно уверен, что вы это понимаете.

Изменение значения переменной не влияет на существующий объект Thread.

1

Вы устанавливаете t в значение null, которое ничего не делает с самим потоком, оно просто присваивает null переменной, в которой вы сохранили ссылку на экземпляр.

Может быть, это поможет:

Что делать, если вы

Object t = new Thread() {...} 
t.start 
Thread t2= (Thread)t; 
t="Orange"; 

ли вы ожидать, магические вещи происходят тогда, а? Что делать, если вы передали t другому методу вместо сохранения другой ссылки в t2?

т просто заполнитель для ссылки на поток, назначая что-то т имеет столько же влияния на нить, как назначение нуль к ниже имеет на номер 2.

Integer a = 2; 
a=null; 
4

t = null; просто удаляет ссылка на экземпляр Thread.
Это не влияет на сам поток.

В частности, исполняемый экземпляр Thread никогда не будет GC'd.

+0

да, это будет GC'd после завершения потока .... :) – karansingh1487

1

@JonSkeet и другие хорошо объяснили, что тогда вы установили t = null, вы не меняете текущий Thread, вы просто меняете переменную t. Как только поток запущен, JVM управляет потоком, поэтому, даже если ссылок на него нет, он все равно будет работать и не будет GC'd.

Другое дело, отметить, что, в цикле, который следует вы делаете:

System.out.println("thread is running..."+Thread.currentThread().toString()); 

Это не распечатка состояния потока, который вы просто раздвоенный, а распечатав Текущая резьба - нить, которая делала разветвление. Это «основной поток», который запускает метод main(). Основной поток может завершиться, и поток, который вы разветвляете, продолжит работать, не позволяя JVM выйти из игры. Только если поток, который вы разветвляли, отмечен как поток демона, будет завершаться JVM, когда закончится основной поток.

0

Настройка t на нуль просто удаляет ссылку на поток, как и все остальные. Поток уже запущен, и ему все равно.

Поскольку эта программа будет работать вечно.Даже если вы выберете цикл while (true) в основном методе, он все равно никогда не выйдет, потому что поток, который вы начали, не является потоком демона. Потоки Daemon уничтожаются после того, как все потоки не-демона вышли, но поток не-демона будет продолжаться до тех пор, пока он не завершится, или вы не убьете процесс, или перезагрузите компьютер.

This answer объясняет, как прервать нить. Обратите внимание, что InterruptedException пойман за пределами цикла, так что поток фактически получает шанс закончить.

+0

Знаете ли вы, что может произойти, если GC попытается забрать поток для удаления во время он все еще работает? Или это может произойти вообще? – jn1kk

+0

@skynorth: он не может, поток - это собственный корень GC. –

+0

Спасибо! – jn1kk

0

Я думаю, что Джон прав, т. Е. «Изменение значения переменной не влияет на существующий объект Thread вообще».

Однако реальное объяснение вам требуется

В методе программирования, который использует статическую или глобальную память локальной для потока. Поскольку обычно все потоки в процессе имеют одно и то же адресное пространство, что иногда нежелательно. Другими словами, данные в статической или глобальной переменной обычно всегда находятся в одной и той же ячейке памяти, когда на нее ссылаются потоки одного и того же процесса. Каждый поток имеет свой собственный стек.

Надеюсь, что данное концептуальное объяснение полезно.

Смежные вопросы