当java线程结束时,runnable类是否超出范围?

时间:2012-06-04 21:48:32

标签: java multithreading

如果我创建一个实现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);

3 个答案:

答案 0 :(得分:3)

来自source of the Thread class

/**
 * 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。