【问题标题】:Java Garbage Collection for Threads线程的 Java 垃圾收集
【发布时间】:2018-06-30 03:36:00
【问题描述】:

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

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

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

【问题讨论】:

  • 它不会被立即删除,但会在后续搜索取消引用的对象时被 GC 删除(不保证会在任何特定的点,即使你通过 System.gc()“强制”垃圾收集。
  • 那么垃圾回收时线程会不会被中断?
  • 无法收集未终止的线程并将继续工作。找到一个退出线程主循环并使用volatile boolean stop 或类似名称的地方。或者或另外,使用Thread.interrupt(不要吞下异常)。

标签: java multithreading garbage-collection


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多