2012-04-28 99 views
7

在Java併發中,什麼使得線程「活動」?只是它不是閒置的事實?在技​​術上,是否仍在考慮「等待」或「暫停」線程?什麼定義了「活動」線程?

+2

什麼是這裏的「主動」出現的背景?這是一個過於籠統的術語,以很少的信息提供硬性定義。 – 2012-04-28 02:28:06

+0

「每個核心擁有4-20個活動線程通常是可以接受的」。 – IAmYourFaja 2012-04-28 02:29:23

+0

有源'java'線程是一個線程是* *資格被執行的當前運行的線程。這是一個線程,它已經離開了「新的」狀態並且已經達到(或重新獲得)了「可運行」狀態。活動線程佔用可運行線程池中的駐留。將上下文敏感的術語* active *視爲「當前正在運行的可運行線程」是常見的錯誤。 – 8bitjunkie 2014-02-12 15:08:01

回答

5

從我可以說'活躍'一詞似乎用了很多,但沒有定義。該ThreadGroup.enumerate()方法記載於:

複製到指定的數組的所有活動線程在此線程 組及其亞組。

looking at the source for this,它正在檢查Thread.isAlive()方法並將它們添加到枚舉中。由此我推斷術語「活動」和「活着」是可互換的並且「活着」被定義爲:

如果線程已經啓動並且尚未死亡,則線程處於活動狀態。

1

在這種情況下,我將「主動」表示他們正在執行代碼。非活動線程 - 在I/O調用或等待鎖定時被阻塞的線程 - 只消耗內存資源而不影響CPU(或者只是稍微)。

但是,它確實取決於你的線程在做什麼。如果每個線程遍歷數字來計算素數,則它們完全受CPU限制,並且實際上每個內核應該只有一個線程來最大化吞吐量。如果他們正在發送HTTP請求或執行文件I/O,則每個內核可以承擔不少的費用。最後,一個覆蓋所有線程的總括性聲明,一般不考慮他們在做什麼,這是毫無價值的。

我強烈推薦本書Java Concurrency in Practice,以獲得高質量併發Java編程主題的處理。

0

「活躍」這個詞在這裏用於正常的英語意義上。

活動這個詞的正常英語含義是「做某事」。因此,對於線程來說,「主動」的直觀含義是它們實際正在執行或準備執行。

在此引用的上下文:

「它通常是可以接受的4 - 每芯20個活動線程」

單詞「活性」與此一致地使用,儘管我會用數字來狡辯。 (20是相當高的IMO)。

但是,我認爲這是一個故意模糊的陳述。給出的答案是使用黃鼠狼短語「它被普遍接受」(而不是引用任何具體的來源)和廣泛的範圍(「4-20」)。因此,你可以說「活躍」一詞是故意模糊的另一個例子。

國際海事組織(IMO),報價的作者正在試圖使「太多線程不好」的一般觀點......沒有確切地說明「太多」是什麼。通過將「主動」意味着什麼來捆綁更精確的指導是毫無意義的。(而且是明確的,它是不可能說有多少「太多」是......一般。)

1

看看java.lang.Thread.State中

在其他非Java系統,主動等同於「RUNNABLE」。任務/進程/線程如果能夠主動運行代碼,則處於活動狀態。如果它不是(阻塞等)

斯蒂芬c。所述,活性被這裏使用更多作爲英語而不是Java的其懸掛。

0

「它通常是可以接受的4 - 每芯20活動線程」。 - Adam Tannon

從這個意義上說,我認爲這個詞的意思是「準備好運行」而不是「活着」或任何其他可能的含義。這是有道理的有沒有比就緒隊列中的線程屈指可數,因爲你不等待的線程得到任何價值,你調度和上下文切換開銷貢獻。另一方面,如果你的可用線程少於核心,那麼你沒有使用可用的資源。

+0

http://stackoverflow.com/questions/3275210/what-is-the-thread-state-of-a-thread-after-thread-yield – andersoj 2012-04-28 15:07:15