2011-10-27 54 views

回答

10

调度程序通常是操作系统的调度程序。它受很多因素的影响,包括机器上的其他进程在做什么,硬件在做什么(中断)等等。根据操作系统的不同,我想有时可能会涉及到随机数字,但我通常不会这样做。更多的是多变量时间间隔可以重叠的不可预知的方式。

0

根据JVM的不同,JVM可能将线程原样传输到操作系统,OS调度程序将调度线程,或者JVM可能决定调度线程本身,所以第一个区别是(第二个不同的机器上的不可预测的行为相同的情况)来到这里,无论线程是由JVM还是OS调度的,你都无法确定..... 此外还有很多因素,线程的优先级是一个因素(我们可以设置优先级),资源是另一个因素....它涉及的随机数字的可能性较小。

+0

当前所有主流JVM都将调度完全留给了操作系统。一些较旧的JVM使用绿色线程,但在这种情况下,* all *线程调度由JVM管理。 –

+0

@MichaelBorgwardt我想SCJP为Java 6的书需要包括这个解释,他们在这本书中提到新旧JVM的不同之处!无论如何感谢您的更新 – Zohaib

4

使用在调度随机数会引入不必要的开销到操作系统的关键部分,因此它不太可能是原因,至少在任何主流操作系统。

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

0

现代操作系统使用了所谓的Preemtive multitasking。它保证系统上的每个进程都有一段CPU时间,并且有关何时中断每个进程的各种规则,并让下一个进程轮流出现。这就是为什么你并不需要每个进程一个CPU的机器:)

这不是随机的,但它是一般无法预见。

1

其他问题做出好点的技术细节,但:

准确地说,在Java线程调度是相当有效地等待控制/通知/ notifyAll的睡眠方法及其他并发控制。 只有在应用程序执行,在这些时间时这些不存在,不同的线程的执行顺序是左未定义

主要原因可能是为了便于在不同的硬件/ OS系统的Java的便携性的缘故。这也是合乎逻辑的,如果你作为一个开发者没有定义你的应用中的不同线程应该使用上面提到的并发控制来执行的顺序,那么你并不关心它,它只是无所谓,然后任意的方式可能是由JVM选择。