为什么可以在循环中创建具有相同变量名的线程对象?

Ing*_*rin 3 java multithreading jvm for-loop

我知道,如果我在主线程的循环内创建一些变量,它将创建一个变量,然后在下一次迭代时它将创建另一个同名的变量,并且它将继续直到循环完成。没问题,因为每次迭代创建的变量都消失了,所以我们可以创建另一个变量。

但是如果我在循环中创建同名的线程怎么办?线程不会同时“终止”。那么为什么这是可能的呢?我觉得我应该将 JVM 与创建变量的工作和操作系统与处理线程的工作分开,但想听到正确的解释。

for (int i = 0; i < 10; i++) {
    MyFirstThread thread = new MyFirstThread();
    thread.start();
}
Run Code Online (Sandbox Code Playgroud)

Ral*_*off 6

您混淆了对象(类实例)和变量。这是Java中完全不同的两个东西。

您可以使用new运算符创建对象,如 中所示new MyFirstThread()。从那时起,它们“永远”存在,直到垃圾收集器发现不再需要它们,对于线程来说,在完成之前不会发生这种情况。

变量可以包含对对象的引用。并且只要一个对象被变量引用,垃圾收集器就不会碰它。

现在,在你的代码中

for (int i = 0; i < 10; i++) {
    MyFirstThread thread = new MyFirstThread();
    thread.start();
}
Run Code Online (Sandbox Code Playgroud)

一个有效的(但简化的)解释是你十次

  • 创建一个名为 的变量thread
  • 创建类的对象MyFirstThread并将对该对象的引用存储在变量中,
  • 启动该线程,
  • 处理变量thread(当执行到达}迭代结束时=变量范围结束)。

关键点是处置变量不会影响它引用的对象。只要该对象有继续存在的理由(例如线程仍在运行),它就会保持活动状态并继续完成其工作。

在循环中,例如在第二次迭代中,第一个thread变量不再存在,但第一个MyFirstThread实例仍然存在并运行。

比喻:

想象一下 MyFirstThread 实例是房屋,变量是一张纸,您可以在其中记下房屋地址。

然后你做十次:

  • 取一张新纸,
  • 在某个位置建造一座房子并将地址写在纸上,
  • 使用表格中的地址,命令某人不断修剪草坪(抱歉,这不是一个完美的类比),
  • 扔掉那张纸。

最终,会有十栋拥有完美草坪的房子,但你将无法进入它们,因为你不再知道如何找到它们。

  • 如果OP关心的话,...当线程仍在运行时“Thread”实例没有被垃圾收集的原因很简单:“run()”方法调用不是线程堆栈的底部。JVM 中的某些函数调用“run()”,并且调用者有一个局部变量保存对“Thread.currentThread()”实例的引用。调用者的局部变量至少继续存在,直到“run()”返回或抛出异常。 (2认同)
  • @IngvarKokorin 这里似乎仍然存在一些误解,所以我会稍微扩展一下我的答案。 (2认同)
  • 它与例如`for (int i = 0; i &lt; 10; i++) { Frame f = new Frame(); 没有什么不同。f.setVisible(true); }`。某些操作,例如“Thread”的“start()”方法或“Frame”的“setVisible”方法,可能会导致该对象被执行环境本身提供的服务引用。有一些方法,如“Thread.getAllStackTraces().keySet()”或“Frame.getFrames()”,允许找到那些仍然活动的对象,即使您还没有对它们的本地引用。 (2认同)
  • @IngvarKokorin,阅读拉尔夫在他的答案中添加的内容——关于房屋和纸条的内容。回复:“这不是同一个参考信息……”这就像说我给你的带有房屋地址的卡片与我给别人的卡片不是同一张卡片。好吧,卡片不一样,但它们都指的是同一个房子。_在 Java 中,如果我的程序有 `Thread t =...`,然后是 `Thread u = t;`,那么是的, `t` 和 `u` 是不同的变量,但它们都引用同一个 `Thread` 实例。GC 不会回收该实例,直到没有剩余变量引用该实例。 (2认同)
  • @Holger 在我的房屋类比中,使用静态“Thread”方法意味着去一些地方当局并向他们询问我拥有的房屋。 (2认同)
  • @RalfKleberhoff 或询问他们所有土地登记的条目并手动搜索您拥有的房屋的条目。 (2认同)