Java 是什么使得线程的执行顺序不可预测?

Java 是什么使得线程的执行顺序不可预测?,java,multithreading,operating-system,Java,Multithreading,Operating System,是什么使得线程的执行顺序不可预测?调度程序是否在某个时刻使用随机数或检查系统资源,或查看哪个线程等待的时间足够长,或者…?调度程序通常是操作系统的调度程序。它受许多因素的影响,包括机器上的其他进程在做什么,硬件在做什么(中断),等等。根据操作系统的不同,我认为有时可能会涉及随机数,但我怀疑通常不会。这不仅仅是多个可变时间间隔可能重叠的不可预测方式。取决于JVM,JVM可能会将线程按原样传输到操作系统,操作系统调度器将调度线程,或者JVM可能会决定调度线程本身,因此第一个区别(在相同情况下,两台不

是什么使得线程的执行顺序不可预测?调度程序是否在某个时刻使用随机数或检查系统资源,或查看哪个线程等待的时间足够长,或者…?

调度程序通常是操作系统的调度程序。它受许多因素的影响,包括机器上的其他进程在做什么,硬件在做什么(中断),等等。根据操作系统的不同,我认为有时可能会涉及随机数,但我怀疑通常不会。这不仅仅是多个可变时间间隔可能重叠的不可预测方式。

取决于JVM,JVM可能会将线程按原样传输到操作系统,操作系统调度器将调度线程,或者JVM可能会决定调度线程本身,因此第一个区别(在相同情况下,两台不同机器上的不可预测行为)到了这里,不管线程是由JVM还是OS调度,你都不能确定。。。。。
此外,还有很多因素,线程的优先级是一个因素(我们可以设置优先级),资源是另一个因素……不太可能涉及随机数。

在调度程序中使用随机数会给操作系统的关键部分带来不必要的开销,所以这不太可能是原因,至少在任何主流操作系统中


线程通常会一直运行,直到发出阻塞的操作系统调用,或者直到中断发生,或者直到其时间片过期(最终只是一个计时器中断)。即使您可以仔细地构造一些东西,使两个线程始终以确定的顺序阻塞,您也无法精确地控制后两种效果何时发生。应用程序中线程的执行顺序最终将受到应用程序外部事件的影响。

现代操作系统使用的是所谓的。它保证系统上的每个进程都有一部分CPU时间,并有各种规则来决定何时中断每个进程,让下一个进程有时间。这就是为什么您的机器上每个进程不需要一个CPU的原因:)


这不是随机的,但通常是不可预测的。

其他问题在技术细节方面很有优势,但:

确切地说,Java中的线程调度是由等待/通知/通知所有方法睡眠方法和其他并发控制相当有效地控制的。 只有在应用程序执行期间,当这些线程不存在时,不同线程的执行顺序才会保持未定义


主要原因可能是因为Java易于在不同的硬件/操作系统中移植。同样合乎逻辑的是,如果作为开发人员,您不使用上述并发控制定义应用程序中不同线程的执行顺序,那么您并不关心它,这也无关紧要,JVM可能会选择任意方式。

所有当前主流JVM都将调度完全留给操作系统。一些较旧的JVM使用绿色线程,但在这种情况下,所有线程调度都由JVM管理。@MichaelBorgwardt我想java 6的SCJP书需要包括这个解释,他们在书中没有提到新旧JVM的区别!无论如何,谢谢你的更新