Нужны ли 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 больше не ссылается, его можно очистить. (как и любой другой объект) Примечание: вы можете удерживать ссылку на него в другом потоке, не позволяя ему очищаться даже при том, что он закончил.