了解线程调度模式

时间:2013-10-13 14:14:09

标签: java eclipse multithreading

我正在使用Eclipse IDE。

我问了这个问题 Multithread output not expected

这个问题对某些人来说似乎很愚蠢,但我仍然得到了一些有价值的意见。 总之,我理解线程是不可预测的。在完成所有答案后,我开始浏览网页,找出“线程无法预测”的原因?

我在某处读到线程调度依赖于OS的进程调度,因为进程实际上是由线程组成的。

我的问题是:

1)如果我的电脑任意只有一个进程运行,即。日食。然后多线程会给出预期的结果??

2)eclipse是一个进程,默认情况下运行的线程越多,我编码的就越多。

请帮助我,我真的想知道为什么我无法预测我的代码输出?

2 个答案:

答案 0 :(得分:2)

是的,eclipse有其他线程正在运行。此外,现代操作系统始终运行其他系统进程。此外,操作系统内核本身具有在其自身内部运行的隐藏线程(至少Linux是这样)。而且,即使这些东西都不存在,硬件本身也可以通过硬件中断来中断,例如硬件中断。当用户按下键盘上的键时。

有一种确定性的线程形式,它被称为合作多线程。没有现代操作系统使用它,因为它不是很好。

答案 1 :(得分:0)

您正在混淆Eclipse,线程和JVM。如果您编写应用程序以使用单个线程,例如只是一个主方法,并且您从Eclipse内部运行,则Eclipse可能会有许多不同的线程,运行您的应用程序的JVM也可能有多个线程(例如,用于垃圾回收) 。但从可预测性的角度来看,您只需要担心应用程序的线程。在计时时,您只需要担心各种其他线程,例如,您可能会遇到不可预测的GC暂停。其他线程不会影响您的应用流程。

如果您开始在应用中创建新线程,那么您需要开始担心线程如何交互。流量是完全不可预测的,并且您无法知道线程的相对时间,因此您必须在代码中允许这样做。

例如假设你在一个类中有一个函数,它增加一个类成员变量并返回它:

int i = 0;
function foo() {
   ++i;
   // do some stuff
   return i;
}

如果由两个不同的线程调用,则有时该函数可能返回1和2.其他时候它可能会返回2到两个线程。

您可能需要编写多线程的具体示例,而您不了解正在发生的事情,以便我们帮助您完成这些工作。