操作系统线程调度程序是否被JVM覆盖?

时间:2017-05-30 16:48:27

标签: java multithreading

根据以下资源,线程调度由操作系统或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.我如何从抢占式调度转变为时间切片调度?反之亦然?

2 个答案:

答案 0 :(得分:3)

  
      
  1. 谁安排线程?
  2.   

操作系统。但是,在应用程序级别,您的JRE可以根据线程优先级调度应用程序级线程;它最终会被OS的调度程序(调度块)调度。用户级线程由用户级库管理,但它们仍然需要内核系统调用才能运行。

  
      
  1. 线程调度程序是否在任何地方被覆盖?(就像操作系统线程被JVM线程调度程序覆盖)
  2.   

Java运行时环境支持一种非常简单的确定性调度算法,称为固定优先级调度。实际调度程序在OS中是唯一的;并从整体角度审视线程的调度,而不是从Java /应用程序级角度来看。

  
      
  1. 如何从抢占式调度更改为时间切片调度?反之亦然?
  2.   

除非您修改操作系统内核(更低级别的内容),否则您无法更改调度程序的调度性质。即使在JRE中,您也无法在应用程序级别更改线程调度。

署名: Thread Scheduling tutorial

答案 1 :(得分:-1)

  1. JVM安排Java线程(虽然实际上操作系统是这样做的。)

  2. 没有单一的Java虚拟机; JVM是一个规范,它有多种实现,包括OpenJDK版本和Sun版本等。任何合理的JVM都会简单地使用操作系统提供的底层线程机制,否则可能存在差异,这意味着UNIX(Mac OS X,Linux等)上的POSIX线程(pthreads)会暗示Windows上的WIN32线程。通常,这些系统默认使用循环策略。

  3. 3.通常,JVM不进行任何调度。这是操作系统的任务。   例如,Linux具有可配置的调度选项,如果要添加   一个新的调度策略,你可以改变内核。

    但是,根据您要执行此操作的原因,您可以解决问题   另一种方式,如使用自定义Executor,或Reactor样式框架,或   有效地禁用CPU的调度并在Java中完成所有工作   你自己。