如果我创建一个实现Runnable的对象,并用它启动一个线程......
ArrayList<Thread> threadlist = new ArrayList<Thread>();
{
MergeThread mmt = new MergeThread();
Thread t = new Thread(mmt);
threadlist.add(mmt);
t.start();
}
t.join();
Thread t = threadlist.get(0);
此时mmt保证存在,或者如果垃圾收集得到它可能已经消失。
我要问的是线程结束后Thread对象是否保留在Runnable类中。
编辑:上面应该说错了 threadlist.add(T);
答案 0 :(得分:3)
/**
* This method is called by the system to give a Thread
* a chance to clean up before it actually exits.
*/
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;
}
因此,系统调用Thread#exit()
并释放对target
(线程正在运行的可运行)的引用。
还有一个bug report #4006245 on bugs.sun.com指的是清除target
引用。
答案 1 :(得分:2)
mmt
已添加到threadList
,因此只要threadList
本身可以访问并且仍然保留它就不会进行垃圾回收,这在您的最后一行仍然是这种情况代码示例,您的第一个t
(在中间块中)是否仍然保留对它的引用。
答案 2 :(得分:1)
您发布的代码对我来说并不是很清楚。但是,关于
此时mmt保证存在,或者如果垃圾收集得到它,它可能已经消失。
我可以说如下:如果你仍然可以抓住它,垃圾收集器将不会收回该对象(如果你无法掌握它,那么就没有意义了担心对象是否已经过GC。