2014-05-21 44 views
5

我試圖想象如果我的機器如果使用雙核處理器,它將如何處理這些代碼。如果它是四核機器,它會如何表現?我有一個雙核心機器。在java中,我的電腦如何管理3個線程的FixedThreadPool?什麼是jvm的可能行爲?

ExecutorService executor = Executors.newFixedThreadPool(3); 

    // Submission of tasks 
    for (int i =0; i<10; i++){ 
     executor.submit(new Processor(i)); 
    } 

處理器有一個run方法上打印「在線程中運行:約睡覺......」 然後睡5秒,然後打印「在線程中運行:醒了......」

我試圖連接java代碼和硬件之間的點。我很難想象這在不同的處理器環境中有何不同。在這種情況下,有人能舉出一個jvm可能行爲的例子嗎?先謝謝你。

+0

答案是要在你正在運行的操作系統某種程度上取決於。也許[ThreadPoolExecutor](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html)類的Javadoc可能會幫助您確定發生了什麼。 –

+0

我會說這裏唯一的限制是線程的數量,因爲你的'處理器'大部分是空閒的。所以,我不指望它在兩個內核或64個內核中表現不同。最後,你的3個首要任務將會啓動,而其他3個任務將排隊,並且每隔5秒鐘,3個當前任務將結束,另外3個任務將開始。它們的調度順序可能有所不同,但主要取決於線程的JVM/OS管理。 – SJuan76

+0

在Java代碼和硬件之間是執行大量任務調度的操作系統 - 我找到了一篇[帶有圖片的文章](http://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/4_Threads.html )。 – vanOekel

回答

4

的回答您的每一個問題是,「是」。或者,爲了不那麼吝嗇,你要求我們記錄的行爲是非常有意義的 undefined 只是鬆散的定義。

JVM和O/S一起工作,可以隨時以任何順序隨意運行您的線程,只要它們有資格運行,可以提供任何CPU /內核,前提是它們之間的睡眠時間至少爲5秒runningwoke up消息。由於睡眠的本質,至少在那個時候,線程會像調度器可以管理的那樣接近時間。

除此之外,還有沒有更多的可以說。


在迴應的意見,問題的代碼將新增10個項目的任務隊列,並且將出列,最多三個在同一時間(*),然後運行每一組三個兼任。

由於執行時間由sleep爲主,行爲將是基本相同的,不管多的內核如何使用。

然而,在這種事情會發生的確切順序是不確定的,超越的事實,在順序添加的任務會被拉斷。所以雖然你可以確定第10項任務將在第1項後執行,但是你不能確定1,2和3的順序,也不能確定4,5或6是否可能在1,2或3完全完成之前開始。

(*),最多三個,因爲最後一組將只有兩個項目,並在運行時需要第三線程將處於空閒狀態。

+0

我實際上是在尋找關於上面的代碼用雙核和四核處理器做什麼的更基本的解釋。我不會問發生了什麼,我正在尋求一種可能的行爲來了解線程究竟是什麼。 –

+0

勞倫斯的答案是最好的你會得到。線程和內核之間的交互是未定義的。在本地級別,您可以控制線程核心關聯,但Java不公開此關聯。因此,在您的程序中,所有10個任務都可以在單個內核上執行,因爲它們是分開的。一個給定任務的各種打印命令也可能在*不同的內核上運行(如果需要,操作系統可以在內核之間翻轉一個線程)。大多數實現將把線程分散到可用的內核上 - 但是這個決定對我們來說是透明的。 –

+0

@TazMan它基本上被歸結爲「任何操作系統需要」。它可以決定隨機挑選2個線程,運行完成,然後拿起第3個線程。它可以決定一次循環兩個線程,給每個線程一個X毫秒的時間片。另一個更高優先級的進程可佔用並佔用整個內核,使得只有1個內核的操作系統安排3個線程。 – Mysticial

相關問題