根据以下资源,线程调度由操作系统或JVM或两者完成。
1。http://tutorials.jenkov.com/java-concurrency/creating-and-starting-threads.html
2。https://www.javatpoint.com/thread-scheduler-in-java
我的问题:
1.who安排线程?
2.线程调度程序在任何地方都被覆盖了吗?(就像被JVM线程调度程序覆盖的OS线程一样)
3.我如何从抢占式调度转变为时间切片调度?反之亦然?
答案 0 :(得分:3)
- 谁安排线程?
醇>
操作系统。但是,在应用程序级别,您的JRE可以根据线程优先级调度应用程序级线程;它最终会被OS的调度程序(调度块)调度。用户级线程由用户级库管理,但它们仍然需要内核系统调用才能运行。
- 线程调度程序是否在任何地方被覆盖?(就像操作系统线程被JVM线程调度程序覆盖)
醇>
Java运行时环境支持一种非常简单的确定性调度算法,称为固定优先级调度。实际调度程序在OS中是唯一的;并从整体角度审视线程的调度,而不是从Java /应用程序级角度来看。
- 如何从抢占式调度更改为时间切片调度?反之亦然?
醇>
除非您修改操作系统内核(更低级别的内容),否则您无法更改调度程序的调度性质。即使在JRE中,您也无法在应用程序级别更改线程调度。
答案 1 :(得分:-1)
JVM安排Java线程(虽然实际上操作系统是这样做的。)
没有单一的Java虚拟机; JVM是一个规范,它有多种实现,包括OpenJDK版本和Sun版本等。任何合理的JVM都会简单地使用操作系统提供的底层线程机制,否则可能存在差异,这意味着UNIX(Mac OS X,Linux等)上的POSIX线程(pthreads)会暗示Windows上的WIN32线程。通常,这些系统默认使用循环策略。
3.通常,JVM不进行任何调度。这是操作系统的任务。 例如,Linux具有可配置的调度选项,如果要添加 一个新的调度策略,你可以改变内核。
但是,根据您要执行此操作的原因,您可以解决问题 另一种方式,如使用自定义Executor,或Reactor样式框架,或 有效地禁用CPU的调度并在Java中完成所有工作 你自己。