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

标签 java multithreading for-loop jvm

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

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

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

最佳答案

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

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

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

现在,在你的代码中

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

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

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

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

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

类比:

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

然后你做十次:

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

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

关于java - 为什么可以在循环中创建具有相同变量名的线程对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69208344/

相关文章:

java - 在 @GetMapping 映射方法内部是否可以获取 value 属性中定义的相对 URL

Java Executor服务性能

java - 如何通过另一个线程更新我的 jLabel?

java - for-each 循环如何工作?

java - Property [project] 标有相互矛盾的注释

java - 如何编写一个按键监听器来跟踪 Java 中的所有击键?

Java - 线程未启动

java - Java中的线程与C++中的线程有什么不同?

ios - iOS:使用在后台运行的方法进行循环?

unix - 如果变量为 false,则中断 for 循环