2013-05-30 86 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,看起来好像会起作用。但是,由于您建议您处理字节数组,因此您所添加的数据大小可能已为您所知。你还必须考虑是否要考虑任何开销。该对象需要一些空间,就像队列本身内部的引用一样。加上队列对象。你可以找出确切的值,但是因为你的要求似乎只是防止内存不足,所以只要你保持一致,你就可以对这些值进行粗略估计。

你想要子类的什么队列类的细节可能取决于你认为在线程之间会有多少争用。但是,这听起来像你有处理同步问题。