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)
您混淆了对象(类实例)和变量。这是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 实例是房屋,变量是一张纸,您可以在其中记下房屋地址。
然后你做十次:
最终,会有十栋拥有完美草坪的房子,但你将无法进入它们,因为你不再知道如何找到它们。
| 归档时间: |
|
| 查看次数: |
318 次 |
| 最近记录: |