簡體   English   中英

是什么讓線程的執行順序不可預測?

[英]What makes the execution order of threads unpredictable?

是什么讓線程的執行順序不可預測? 調度程序是否在某些時候使用隨機數或檢查系統資源或查看哪個線程已等待足夠長的時間或......?

調度程序通常是OS的調度程序。 它受許多因素的影響,包括計算機上的其他進程正在執行的操作,硬件在執行的操作(中斷)等。根據操作系統的不同,我認為有時可能涉及隨機數,但我通常懷疑不是。 多個可變時間間隔可能會重疊,這只是一種不可預測的方式。

在調度程序中使用隨機數會給操作系統的關鍵部分帶來不必要的開銷,因此,至少在任何主流操作系統中,這都是不可能的。

線程通常會運行直到它發出將阻塞的OS調用,或者直到發生中斷,或者直到其時間片到期為止(最終只是定時器中斷)。 即使您可以精心構造事物,以便兩個線程始終按確定的順序阻塞,您也無法精確控制后兩個效果何時發生。 應用程序中線程的執行順序最終將受到應用程序外部事件的影響。

其他問題也提供了技術細節,但是:

確切地說,Java中的線程調度由lockswait / notify / notifyAllsleep方法和其他並發控件相當有效地控制。 僅在應用程序執行期間的那些時間, 當這些時間不存在時 ,不同線程的執行順序才保持未定義狀態

主要原因可能是為了簡化Java在不同硬件/ OS系統中的可移植性。 同樣合乎邏輯的是,如果您作為開發人員未定義使用上述並發控件執行應用程序中不同線程的順序,那么您將不必在乎它,那就沒關系了,可能采用任意方式由JVM選擇。

取決於JVM,JVM可能會將線程直接轉移到OS,而OS Scheduler會調度線程,或者JVM可能會決定調度線程本身,因此第一個區別(在相同情況下,兩台不同機器上的行為無法預測)來了在這里,無論線程是由JVM還是由OS調度,您都無法確定.....此外,還有許多因素,線程的優先級是一個因素(我們可以設置優先級),資源是另一個因素... 。涉及隨機數的可能性較小。

現代操作系統使用所謂的Preemtive多任務處理 它可以確保系統上的每個進程都占用CPU時間,並為何時中斷每個進程以及讓下一個進程輪流使用各種規則。 這就是為什么您的計算機上每個進程不需要一個CPU的原因:)

它不是隨機的,但通常是不可預測的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM