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

Why it's possible to create thread object with the same variable name in the loop?

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

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

for (int i = 0; i < 10; i++) {
    MyFirstThread thread = new MyFirstThread();
    thread.start();
}

您混淆了对象(class 个实例)和变量。在Java.

中这是两个完全不同的东西

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

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

现在,在您的代码中

for (int i = 0; i < 10; i++) {
    MyFirstThread thread = new MyFirstThread();
    thread.start();
}

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

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

关键是处理变量不会影响它引用的对象。只要这个对象有继续存在的理由(例如线程仍然运行),它就会保持活力并继续工作。

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

类比:

将 MyFirstThread 实例想象成房子,变量是 sheet 您在上面记下房子地址的纸。

那你做十次:

  • 拿一张新的 sheet 纸,
  • 在某个地方盖房子,把地址写在sheet纸上,
  • 使用您 sheet 中的地址,命令某人不断修剪草坪(抱歉,不是一个完美的类比),
  • 扔掉纸sheet

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

您只需将对新自定义对象 MyFirstThread 的引用分配给新变量 thread。在循环变量 thread 的每个循环中超出范围,您失去了对 MyFirstThread 和创建的新变量 thread 的引用。