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