2017-05-30 97 views
0

根据以下资源,线程调度由操作系统或JVM或两者完成。操作系统线程调度程序是否被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.does线程调度器被覆盖的任何地方?(如OS线程由JVM线程调度器被覆盖)

3.how我该从抢占式调度更改为时间分片调度?或相反亦然?

+2

我认为你正在寻找旧资源。操作系统调度线程。你不应该在这个低级别处理并发。您应该使用JDK和新的并发包。 – duffymo

+0

请解释什么是并发包? –

+0

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html – duffymo

回答

2
  1. 谁安排线程?

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

  • 不线程调度被任何地方重写?(如OS线程通过JVM线程调度被覆盖)
  • Java运行时环境支持非常简单,称为固定优先级调度的确定性调度算法。实际的调度程序在操作系统中是唯一的;并从整体角度看待线程的调度,而不是从Java /应用程序级角度来看。

    1. 我该如何从抢先式调度改为时间片调度?或相反亦然?

    无法更改调度的调度的性质,除非你修改操作系统内核,这也是较低级别的东西。即使在JRE中,也不能在应用程序级别更改线程调度。

    +0

    我可以知道为什么downvote? –

    +0

    我怀疑downvoting背后的意图是要确保这个问题没有得到upvoted的答案,以防止它被删除。我不会认为它是对你的帖子内容的批评。 –

    -1
    1. JVM调度Java线程(虽然实际上它是在执行它)。

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

    3.一般情况下,JVM不会做任何调度。这是操作系统的任务。 Linux例如具有可配置的调度选项,如果您想添加新的调度策略,您可以更改内核。

    但是,取决于你为什么要做到这一点,就可以解决问题 另一种方式,例如使用自定义的执行人,或反应堆的风格框架,或 的CPU有效地禁用调度和做所有的工作你自己Java 。

    相关问题