我看到所有停止和销毁以及处理清理方法的任何其他内容都已被弃用。
如果我有一个新的Thread()或一个扩展Thread运行的类,我是否需要在run()方法中做任何事情,而不是让它到达常规执行的末尾?或者是否有一种后台机制可以理解Thread已经完成了所有任务并且可以被销毁?
答案 0 :(得分:13)
当您在线程上调用start()
时,靠近操作系统的JVM中的本机机制正在启动您的线程,最终执行run()
。当run()
完成时,JVM会处理所有事情。
您可能会担心垃圾收集或其他资源清理。当然,如果你在一个线程中打开文件/网络连接,它必须像其他地方一样关闭。此外,垃圾收集器在分析 live 对象时,会考虑从正在运行的线程引用的对象。但是当线程结束时,它引用的所有对象(或传递给线程的Runnable
实现)都有资格进行垃圾回收。
对线程的退出方法进行快速和粗略编辑,因为缺少可见的contextClassLoader 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;
}
答案 1 :(得分:9)
不需要清理。一旦完成任务,jvm将杀死它。
答案 2 :(得分:1)
stop()方法实际上导致Thread抛出错误或异常。它被弃用的原因是,这可能发生在代码中任何在可能未知状态下修改的内容中。 stop()在停止当前线程时才真正安全,因为你知道什么时候会发生。顺便说一句,您可以捕获错误/异常,这意味着线程不会停止()。
在任何情况下,结果都是相同的,run()返回(或者无法捕获异常/错误)。 stop()方法触发一个名为ThreadDeath的特殊错误。关于它的唯一特别之处在于,通常会打印未捕获的异常/错误,但这不是。 (并且它的名称末尾没有错误;)如果您愿意,可以更改此行为。
当不再引用Thread时,可以清除它。 (就像任何其他对象一样)注意:你可以在另一个线程中保存对它的引用,防止它被清理,即使它已经完成了。