0

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

考虑推送的对象为

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

1 回答 1

0

Java 中没有开箱即用的功能。(部分是因为没有简单的方法可以知道添加到集合中的对象是否在其他地方引用,因此添加它们是否会占用额外的内存。)

对于您的用例,您最好只继承队列。覆盖 super 以将对象的大小添加到计数器(显然您必须使此计算线程安全。)如果没有空间,则抛出异常 IllegalStateException。如果在覆盖的删除类上,同样减少您的计数器。

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

您想要子类化的队列类的详细信息可能取决于您认为线程之间会有多少争用。但听起来你已经处理了同步问题。

于 2013-05-30T17:09:27.550 回答