Нужны ли Java-потоки какие-либо очистки?
Я вижу, что все остановки и уничтожения и все остальное, что связано с методами очистки, устарели.
Если у меня есть новый Thread() или класс, который расширяет Thread running, мне нужно что-то делать в его методе run(), кроме как допустить его до конца регулярного выполнения? Или есть фоновый механизм, который понимает, что Thread выполнил все свои задачи и может быть уничтожен?
Ответы
Ответ 1
Когда вы вызываете start()
в своем потоке, собственный механизм в JVM, близком к операционной системе, запускает ваш поток, в конечном итоге выполняя run()
. Когда run()
заканчивается, JVM все оборачивается.
Возможно, вас беспокоит сбор мусора или очистка других ресурсов. Конечно, если вы открываете файловое/сетевое соединение внутри потока, оно должно быть закрыто, как и везде. Также сборщик мусора, анализируя живые объекты, учитывает объекты, относящиеся к текущим потокам. Но момент окончания заканчивается, все объекты, на которые он ссылается (или на реализацию Runnable
, переданные потоку), имеют право на сбор мусора.
quick & dirty edit для метода выхода Thread, поскольку видимый контекстClassLoader отсутствует x.x
private void exit() {
if (group != null) {
group.remove(this);
group = null;
}
/* Aggressively null out all reference fields: see bug 4006245 */
target = null;
/* Speed the release of some of these resources */
threadLocals = null;
inheritableThreadLocals = null;
inheritedAccessControlContext = null;
blocker = null;
uncaughtExceptionHandler = null;
}
Ответ 2
Никакой очистки не требуется. Когда он закончит свою задачу, jvm убьет его.
Ответ 3
Метод stop() фактически заставляет Thread вызывать ошибку или исключение. Причина, по которой она устарела, это может произойти где угодно в коде, что она модифицирует в потенциально неизвестном состоянии. stop() действительно безопасен при остановке текущего потока, потому что вы знаете, когда это произойдет. BTW, вы можете поймать ошибку/исключение, что означало бы, что Thread не останавливается().
В любом случае результат будет таким же, run() возвращает (или не может поймать Исключение/Ошибка). Метод stop() запускает специальную ошибку, называемую ThreadDeath. Единственное, что особенно важно в этом, так это то, что обычно печатается неперехваченное исключение/ошибка, но этого нет. (И он не имеет ошибки в конце своего имени;) Вы можете изменить это поведение, если хотите.
Когда Thread больше не ссылается, его можно очистить. (как и любой другой объект) Примечание: вы можете удерживать ссылку на него в другом потоке, не позволяя ему очищаться даже при том, что он закончил.