Java线程的垃圾回收

3

Java的垃圾回收机制如何处理线程?

为了澄清,我正在用Java编写一个点对点网络,如果发现某个节点表现恶意或被拒绝加入路由表,我会删除所有对该节点对象的引用,该对象扩展了一个线程。

我是否可以认为,即使我删除了对该实例的所有引用,线程仍然存在,并且因此实例也不会被垃圾回收器移除?


它不会立即被移除,而是在后续搜索取消引用对象时由GC删除(没有保证它会在任何特定点被拾取,即使您通过System.gc()“强制”垃圾回收)。 - MarsAtomic
在垃圾回收期间,线程会被中断吗? - Lev Knoblock
一个未终止的线程无法被回收并将继续执行其工作。找到一个退出线程主循环的地方,并使用 volatile boolean stop 或类似的东西。另外,或者可以使用 Thread.interrupt(不要吞掉该异常)。 - maaartinus
1个回答

5
不,线程在运行时不会被收集或停止。
您应该在线程内部停止线程,例如通过使用命令return;
以下是一个实验:
public class Main {
public static void main(String[] args) {

    Runnable r = new Runnable(){
        public void run() {
            for (int i=0; i < 10; i++) {
                System.out.println("Thread is running");
            }
            return;
        }
    };

    Thread t=new Thread(r);
    t.start();
    t=null;

    System.out.println("App finished");

}
}

这是结果:

App finished
Thread is running
Thread is running
Thread is running
Thread is running
Thread is running
Thread is running
Thread is running
Thread is running
Thread is running
Thread is running

因此,即使主线程将引用设置为null并停止工作,该线程仍未停止或收集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接