2012-04-20 76 views
0

問題一個java.util.arrayqueue,處理的程序可以從一個靜態java.util.arrayqueue順序讀取多個線程?如果一個進程程序的三個線程運行和三個數據對象到達入arrayqueue,每個線程處理一個數據對象或只有一個線程將處理所有三個數據對象讀取多個線程

回答

1

您正在描述生產者 - 消費者模式。

的幾點

  • 如果您產卵三個線程,它們每一個循環,閱讀過相同的隊列,然後將他們全部嘗試使用隊列中的項目。沒有保證每個線程將消耗多少項目。這完全取決於JVM中的線程調度程序(或OS級別)。一般來說,如果大量相似的項目被添加到隊列中,每個線程將消耗大致相同數量的項目。

  • ArrayQueue不是因爲它不是線程安全的這個用例一個不錯的選擇。更好的選擇是的ConcurrentLinkedQueue或ConcurrentBlockingQueue

直接回答你的問題,是的,你可以有多個線程從同一隊列中讀取,但請考慮以上。

0

通常情況下,你要使用同步的線程到每個線程讀取1個輸入。

要回答你的問題,無法確定在這種情況下的行爲。你應該強制你的線程同步,以確保每個線程在任何時候都很忙,而不僅僅是一個。

0

你真的很想在這種情況下使用同步或切換到更合適的數據結構。

從arrayqueue的文檔: 他們不是線程安全的;在不存在外部同步的,它們不支持由多個線程

0

假設arrayqueue壓入/彈出是線程安全和併發訪問所使用不限制運行的線程的數目的任何信令:

Depends中可用的內核數量以及線程處理數據的速度。如果有三個空閒內核並且排隊的任務需要一些時間,那麼這三個線程可以同時運行這三個任務。如果任務非常簡短,並且系統上有一些負載,使得在數據提交時只有一個線程是空閒的,則一個線程可能會比賽並在另一個線程變爲可用之前執行所有三個項目。如果內核比任務少,那麼顯然只有[不。內核]任務可以同時運行。

混合並匹配那些可能性。