2013-03-31 35 views
2

假設我有2個線程a和b在同一進程中運行。處理器從b中運行幾條指令,等等,直到達到如下代碼行:Thread.sleep(1000)。睡眠線程何時繼續在Java中執行?

問題是我真的不明白處理器接下來會做什麼。

  • 同時B正在運行
  • 1000 milisecond間隔已經過去,從而

    1)

    • 條條的開始睡1000毫秒
      • 如果我懷疑這些2個scenerios processor仍然運行線程代碼b
        • 然後等到它完成
        • 並運行線程提供更多的代碼
      • 其他
        • 運行更從線程代碼

    2)

    • 主題一開始睡眠爲1000毫秒
    • 同時B正在運行
    • 1000 milisecond間隔已經結束這樣:

      • 如果proccessor仍然運行從線程B代碼

        • STOP THREAD B.因爲線程一個具有更高的優先級它的代碼必須在1000毫秒間隔後馬上運行
        • 並運行線程代碼更多
        • 然後從我們離開的地方運行線程B的代碼。從螺紋
      • 其他
        • 運行更加碼

    哪一個類似於什麼實際發生在幕後? 如果兩者都不對,請指出我正確的答案。

  • +1

    當它醒來。 –

    +0

    你說「處理器」,但現在大多數系統都是SMP。 – stark

    +0

    @stark不相關的問題 – m0skit0

    回答

    3

    這是調度線程和進程的操作系統,而不是處理器。它是如何實現的取決於OS scheduler,它因操作系統而異。

    即使JVM確實有線程調度程序the behavior ultimately does not depend on the JVM, but on the underlying OS scheduler

    有關2.6 Linux調度程序的工作方式,請參閱this

    +0

    但是線程A有更高的優先級? –

    +0

    仍取決於調度程序策略。 – m0skit0

    +2

    @ m0skit0當我們使用非阻塞I/O並且從文件系統讀取時,同樣的事情適用,爲讀取完成時提供回調(回調可能包含將內容打印到屏幕上的代碼或某些東西其他),我們有更多的代碼。在這種情況下,回調將在什麼時候運行?當我們完成運行代碼的其餘部分或從文件系統讀取內容後立即運行...(問題類似於第一個問題,而不是睡眠,問題來自非阻塞I/O) –

    4

    很多因素起作用,所以很難爲您的問題提供絕對的答案。

    但是根據您給出的可用選項,#2將最接近。

    一個不同的線程被調用,以在殼體運行下面 事件之一發生:

    ....
    線程與更高的優先級小於線程當前運行進入可運行狀態。優先級較低的線程 被搶佔,並且較高優先級的線程計劃運行。

    這是source

    +1

    這最終不依賴於JVM,[但是,**又是**,在底層OS調度程序上](http://javaho.wordpress.com/2011/01/10/jvm-thread-scheduling-is-平臺相關/)。 – m0skit0

    +0

    注意@ m0skit0。 – Jops

    +0

    +1。是。如果一個正在等待I/O的線程必須等待其他可能優先級較低的線程「完成」,那麼根本沒有理由使用搶先式多任務操作系統。 –