我知道如果我在主线程的循环内创建一些变量,它会创建一个,然后在下一次迭代时它会创建另一个同名的变量,它会一直持续到循环完成。没问题,因为每次迭代创建的变量都消失了,所以我们可以创建另一个。
但是如果我在循环中创建具有相同名称的线程怎么办。线程不会同时“终止”。那为什么可能呢?我觉得我应该将 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/