2013-05-30 82 views
0

我必須實現一個隊列,在兩個不同線程的基礎上,根據一些因素,將對象添加到兩個不同的線程並將其刪除。我的問題是需求說隊列(整個隊列和數據它不應該)採取200KB +數據。如果大小爲200線程應該等待空間可用來推送更多的數據。對象推送可能會有所不同大小。我可以創建java隊列obut大小的隊列將返回總推送的對象,而不是使用的總內存我如何確定我的隊列引用的數據的總大小。確定隊列大小

考慮對象推爲

class A{ 
     int x; 
     byte[] buf;//array size vary per object 
    } 
+0

你可以做類似於這裏描述的內容:http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-對象 – Farlan

+0

在我看來,ArrayBlockignQueue包含了這個功能。 (它看起來有一個固定的元素數量,而不是固定的大小。) –

回答

0

沒有開箱即用的功能,這在Java中。 (部分原因是因爲沒有簡單的方法可以知道添加到集合中的對象是否在其他地方被引用,因此如果添加它們會佔用額外的內存。)

對於您的用例,您可能最好只是繼承隊列。重寫super將對象的大小添加到計數器(顯然,您必須使此計算線程安全),並且如果它沒有空間,則拋出異常IllegalStateException。同樣,如果在重寫的刪除類上減少計數器。

確定如何向計數器添加太多空間的方法可能會有所不同。 Farlan建議使用this,看起來好像會起作用。但是,由於您建議您處理字節數組,因此您所添加的數據大小可能已爲您所知。你還必須考慮是否要考慮任何開銷。該對象需要一些空間,就像隊列本身內部的引用一樣。加上隊列對象。你可以找出確切的值,但是因爲你的要求似乎只是防止內存不足,所以只要你保持一致,你就可以對這些值進行粗略估計。

你想要子類的什麼隊列類的細節可能取決於你認爲在線程之間會有多少爭用。但是,這聽起來像你有處理同步問題。