2017-05-30 131 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 。

    相關問題