这里有两个主要问题需要解决。我还建议您查看Gray的答案以获取更多技术信息。
**注意:这只是表面现象,但大多数其他答案认为我认为您尚未掌握的这些计算机科学主题的背景知识是理所当然的。
首先,线程不能保证执行顺序。一般来说,你应该只使用可以异步工作的线程(独立定时)。对于此示例,您有一个特定于时间的预期结果,因此可能应该避免使用线程。
但是,这不是您唯一的问题。
照原样,您的代码也有所谓的竞争条件。当两个不同的线程(或进程)有权读取/操作相同的数据时,就会出现竞争条件——在您的情况下,i
通过i++
.
例如,
想象一下,你和一个朋友都有一美元。冰淇淋人开着车停在你面前。冰淇淋人只剩下一个冰淇淋蛋筒了。有几种方法可以发挥作用:
- 你比你的朋友快,先买锥体。
- 你比你的朋友慢,他先买了锥体。
- 您决定拆分冰淇淋蛋筒并支付 0.50 美元。
- 你们两个打架,其他人可以在你们两个分心的时候买最后一个冰淇淋蛋筒。
要将其镜像回计算机,
- 即使您启动了第二个线程,您正在打印的主线程也会继续运行。(线程链接到同一个进程,所以当 main 返回时,其他线程“死掉”。有可能线程,即使它是 a.start()'ed,也可能没有完成,甚至可能没有机会根本跑!)
- 另一个线程在返回主线程之前运行并完成。
- 你轮流执行,每个人都可以做几行代码。这里的输出真的是异步的。这很可能会发生。
- java 应用程序进程失去了 CPU 并且其他人开始运行(可能访问类似的共享信息。)
TL;博士-
如果你想确保执行顺序,那么就不要使用线程。
在某些情况下,沿途在某些点同步会很好。对于这些情况,您可以加入线程(等待线程完成后再继续),或使用互斥锁或信号量(更高级的同步技术)锁定竞争条件。
我建议在尝试与庞大的操作系统进行战斗之前先阅读这些主题。