代码之家  ›  专栏  ›  技术社区  ›  Lev Knoblock

线程的Java垃圾回收

  •  3
  • Lev Knoblock  · 技术社区  · 6 年前

    Java的垃圾收集究竟是如何处理线程的?

    为了澄清这一点,我用java编写了一个对等网络,如果一个对等网络被确定为恶意行为或被路由表拒绝,我将删除对对等对象的所有引用,该对象扩展了一个线程。

    即使我删除了对该实例的所有引用,垃圾收集器也不会删除该实例的线程,因此也不会删除该实例,这是正确的吗?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Eugene Kartoyev    6 年前

    不。它在运行时不会被收集或停止。

    您应该在线程内停止线程,例如使用命令 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并停止工作之后,线程也没有停止或收集。