Java 确定队列大小

Java 确定队列大小,java,queue,buffer,priority-queue,Java,Queue,Buffer,Priority Queue,我必须实现一个队列,根据某些因素,两个不同的线程将在不同的时间向其中添加和删除对象。我的问题是要求队列(整个队列及其所包含的数据)不应使用200KB+数据。如果大小为200,线程应等待可用空间来推送更多数据。推送的对象大小可能不同。我可以创建java队列对象,但队列大小将返回推送的对象总数,而不是使用的总内存如何确定队列引用的数据的总大小。 将推送的对象视为 class A{ int x; byte[] buf;//array size vary per ob

我必须实现一个队列,根据某些因素,两个不同的线程将在不同的时间向其中添加和删除对象。我的问题是要求队列(整个队列及其所包含的数据)不应使用200KB+数据。如果大小为200,线程应等待可用空间来推送更多数据。推送的对象大小可能不同。我可以创建java队列对象,但队列大小将返回推送的对象总数,而不是使用的总内存如何确定队列引用的数据的总大小。

将推送的对象视为

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

Java中没有现成的功能。(部分原因是,无法轻松知道添加到集合中的对象是否在其他位置引用,因此添加它们是否会占用额外内存。)

对于您的用例,您最好只对队列进行子类化。重写super以将对象的大小添加到计数器(显然,您必须使此计算线程安全),并在没有空间时抛出异常IllegalStateException。类似地,如果在重写的remove类上,则减少计数器

确定要向计数器添加多少空间的方法可能会有所不同。Farlan建议使用,看起来它会起作用。但是,由于您建议处理的是字节数组,因此您可能已经知道要添加的数据的大小。您还必须考虑是否要考虑任何开销。对象占用了一些空间,队列内部的引用也占用了一些空间。加上队列对象。您可以计算出它的精确值,但因为您的需求似乎只是为了防止内存溢出,所以只要您保持一致,您可能只需要对这些数据进行粗略估计


您希望子类化的队列类的详细信息可能取决于您认为线程之间会有多少争用。但听起来您对同步问题有一个处理方法。

您可以执行此处所述的操作:在我看来,ArrayBlockSignQueue并不包含此功能。(它似乎有固定的元素计数,而不是固定的大小。)