是什么让线程的执行顺序变得不可预测?
是什么让线程的执行顺序变得不可预测? 调度程序在某些时候是使用随机数还是检查系统资源,或者查看哪个线程等待了足够长的时间或者……?
调度程序通常是OS的调度程序。 它受到许多因素的影响,包括机器上的其他进程正在做什么,硬件正在做什么(中断)等。根据操作系统的不同,我认为有时可能会涉及随机数,但我一般不怀疑。 更多只是多变量时间间隔可以重叠的不可预测的方式。
在调度程序中使用随机数会给操作系统的关键部分带来不必要的开销,因此这是不太可能的原因,至少在任何主流操作系统中都是如此。
一个线程通常会运行,直到它进行一次OS调用才会阻塞,或直到发生中断,或直到它的时间片到期(最终只是一个定时器中断)。 即使您可以仔细构造事物以使两个线程始终以确定的顺序阻塞,您也无法精确控制后两个效果何时发生。 执行应用程序中的线程的顺序最终将受到应用程序外部事件的影响。
其他问题与技术细节有关,但是:
确切地说,Java中的线程调度由lock , wait / notify / notifyAll , sleep方法和其他并发控制相当有效地控制。 仅在应用程序执行期间的那些时间, 当这些不存在时 ,不同线程的执行顺序未定义 。
主要原因可能是为了便于Java在不同硬件/ OS系统中的可移植性。 它也是合乎逻辑的,如果你作为一个开发人员没有定义应用程序中应该使用上面提到的并发控件执行不同线程的顺序,你就不关心它,它只是无所谓然后任意方式可能是由JVM选择。
根据JVM,JVM可能会将线程原样转移到OS,OS调度程序将调度线程,或者JVM可能决定调度线程本身,因此第一个区别(在同一情况下2台不同机器上出现不可预测的行为)在这里,无论线程是由JVM还是OS调度,你都不能确定…..还有很多因素,线程的优先级是一个因素(我们可以设置优先级),资源是另一个因素…… 。随机数的可能性较小。
现代操作系统使用所谓的Preemtive多任务处理 。 它保证系统上的每个进程都有一段CPU时间,各种规则用于何时中断每个进程并让下一个进程转向。 这就是为什么你的机器上每个进程都不需要一个CPU 🙂
它不是随机的,但通常是不可预测的。
- Thrift无法从json反序列化为java对象
- 将两个jre,一个在jdk和一个outsite jdk中放在Program文件的java文件夹中的原因是什么?
- 有没有办法知道arraylist是否包含一段文字?
- 自动化Eclipse插件开发的unit testing(junit)
- 为什么最终的字段变量不能在Java中分配给空白?
- 如何使C#名称空间像Java包一样工作,以便在移动它们时自动重命名?
- JavaMail中的props.put(“mail.smtp.host”,host)是做什么用的?
- 如何在Spring中使用@ComponentScan懒洋洋地加载所有bean?
- 首次连接数据库时,NullPointer在日志中