当前位置: 首页 > 面试题库 >

在没有引用的情况下,新的Thread()将被垃圾回收

孔权
2023-03-14
问题内容

在下面的示例中,new Thread()没有任何引用。可能是被废弃的垃圾收集了吗?同样,在不扩展Thread类或实现可运行的情况下,我们如何创建线程?

public class TestFive {
    private int x;
    public void foo() {
            int current = x;
            x = current + 1;
    }
    public void go() {
            for(int i = 0; i < 5; i++) {
                    new Thread() {
                            public void run() {
                                    foo();
                                    System.out.print(x + ", ");
                            } 
                    }.start();
            } 
    }
    public static void main(String args[]){
            TestFive bb = new TestFive();
            bb.go();
    }
}

问题答案:

如果尚未启动的新线程无法正常访问,则将对其进行垃圾回收。

已经启动的新线程成为垃圾回收“根”。它不会(直到)完成才被垃圾收集。

在下面的示例中,new Thread()没有任何引用。可能是被废弃的垃圾收集了吗?

不。它已经启动,因此在完成/死亡之前不会被垃圾收集。并且它 确实 有一个可达的引用,直到(至少)start()调用返回为止。

同样,在不扩展Thread类或实现可运行的情况下,我们如何创建线程?

在你的榜样,你 已经 创建的匿名子类Thread; 即扩展的类Thread



 类似资料:
  • 我看到的所有解决方案都需要使用。但是,我想在Eclipse之外的单个文件上使用CDT解析器。那有什么办法吗?

  • 问题内容: 在学习OCJP时,我遇到了以下问题: 当// doStuff到达时,有多少个对象可以使用GC? 正确答案是2,含义及其目的。 当到达// doStuff行时,c3也为null。为什么它也没有资格获得GC? 问题答案: c3是带有空引用的本地句柄,它不指向(并且已经指向了)分配的对象。因此,GC无需任何操作。

  • 问题内容: 首先,我想澄清一下我的理解,因为以下问题是相同的。 上面代码的输出是 这意味着,尽管一旦GC运行,实际的对象对象就会被垃圾回收,但是内存中仍然有一个类对象,该对象此时不指向任何对象。 现在考虑到上述理解为真,我对工作原理感到困惑。在下面的代码中 输出: 现在的 问题 是,据说输入是弱引用,这意味着在上面的代码中, 成为实际对象时可以进行垃圾回收,因为不再有对该对象的强引用,但是 和作为

  • 我在为异步消息传递开发轻量级库的过程中遇到了这种情况。为了了解创建大量中等大小的短生命周期对象的成本,我编写了下面的测试: 在我的笔记本电脑上,使用默认的GC设置,它运行大约需要95秒: 这就是事情变得奇怪的地方。我调整了程序,为每次迭代分配一个新对象: 理论上,这应该会增加一些小开销,但是没有一个对象应该被提升到Eden之外。充其量,我希望运行时接近相同。然而,这个测试在大约17秒内完成: 我运

  • 问题内容: 如果堆上有两个互相引用的对象,但它们没有链接到任何引用变量,那么这些对象是否可以进行垃圾回收? 问题答案: 对,他们是。基本上,GC从“已知根”(静态变量,来自alll线程中所有堆栈帧的局部变量)中查找无法进行垃圾回收的对象。如果无法从根目录访问对象,则可以收集该对象。 编辑:汤姆指出了这一点,我认为值得将答案本身引入: 从技术上讲,静态变量不是根-它们是由类加载器所引用的类所引用的,

  • 问题内容: 我已经阅读了很多有关在Java中优化GC的文章,并且经常想知道有多少人 真正 使用了一些更高级的功能。 我一直避免在可能的地方进行调整,而专注于编写我能做的最简单的代码(Brian Goetz的建议)-到目前为止,这对我来说似乎一直很好。 这些调整策略是否具有弹性,可以跨VM版本进行更改,或者它们需要不断进行重新评估? 我使用的一种调优是-server标志。 问题答案: 我当前工作的一