Ссылка завершения потока Java - PullRequest
6 голосов
/ 23 апреля 2011

Почему невозможно завершить поток, установив для него ссылку на null и позволив сборщику мусора удалить его?Это объект, как и любой другой, не так ли?

пример:


Thread t = new Thread(new Runnable() {
  public void run() {
    //...
  } 
}).start;

t = null;

Ответы [ 4 ]

3 голосов
/ 23 апреля 2011

Это объект, как и любой другой, не так ли?

Нет, это не так.Он представляет ресурс без памяти.Вы ожидаете, что файл будет удален, потому что объект, представляющий его, является сборщиком мусора?

На самом деле, когда речь идет о сборке мусора, Thread объект - это , очень сильно не"как и любой другой "объект, поскольку сам поток является корнем дерева достижимости, поэтому любые объекты, на которые ссылаются поля (или локальные переменные в стеке) объекта Thread, представляющего работающий поток, по определению не подходит для сбора мусора.

2 голосов
/ 23 апреля 2011

В разделе 12.6 JLS говорится следующее:

"Достижимый объект - это любой объект, к которому можно получить доступ в любом потенциальном продолжающемся вычислении из любого живого потока.".

Из этого мы можем сделать вывод, что живые потоки неявно достижимы и не будут собирать мусор, пока они живы.Существование или нет доступной ссылки на объект Thread не имеет значения, хотя (как говорит @Jon Skeet) поток неявно хранит ссылку на свой собственный объект Thread, так что Thread.currentThread() будет работать.

2 голосов
/ 23 апреля 2011

Вы устанавливаете только значение переменной на ноль.

Итак, вопрос в том, действительно ли у любого потока есть ссылка на этот Thread объект. Рассмотрим сам новый поток ... он может легко включать

System.out.println(Thread.currentThread());

Что бы вы ожидали от этого, если бы объект Thread был собран мусором?

Объекты - это только мусор, собираемый в некоторый момент после того, как нет живых ссылок на них больше. Любой живой поток имеет ссылку на себя.

Честно говоря, было бы больно, если бы вам пришлось убедиться, что вы действительно сохранили ссылку на только что созданный поток, чтобы предотвратить его внезапную остановку.

2 голосов
/ 23 апреля 2011

По той же причине вы не можете просто установить ссылку на JFrame в null, чтобы окно волшебным образом исчезло.JVM имеет ссылку на поток, поэтому даже если вы забудете о потоке, JVM не будет.Вам нужно будет правильно завершить поток, желательно с его главной функцией end.

...