2013-05-30 2 views
0

Я должен реализовать очередь, к которой объект будет добавлен и удален двумя разными потоками в разное время на основе некоторого коэффициента. Моя проблема заключается в том, что требование: очередь (целая очередь и данные, которые она хранит) не должна возьмите 200 Кбайт + данных. Если размер 200 потоков должен ждать, пока пространство будет доступно для ввода большего количества данных. Объект, нажатый, может различаться по размеру. Я могу создать очередь java obut, размер очереди вернет общий объект, нажатый вместо общей используемой памяти Как определить размер данных totla, на которые ссылается моя очередь.Определение размера очереди

Рассмотрим объект выдвигали в качестве

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- object – Farlan

+0

Не похоже на то, что ArrayBlockignQueue включает эту функцию. (Кажется, у него есть фиксированный элемент, а не фиксированный размер.) –

ответ

0

Там не из функциональных возможностей коробки для этого в Java. (Отчасти потому, что нет простого способа узнать, добавлены ли объекты, добавленные в коллекцию, в другом месте, и поэтому, если их добавление занимает дополнительную память.)

Для вашего варианта использования вы, вероятно, лучше всего просто подклассифицируете очередь. Переверните супер, чтобы добавить размер объекта в счетчик (очевидно, вам нужно будет сделать этот поток потоков безопасным.) И выбросить исключение IllegalStateException, если в нем нет места. Аналогичным образом уменьшите свой счетчик, если на переопределенном классе remove.

Метод определения того, как много места для добавления в счетчик может отличаться. Фарлан предложил использовать this, и похоже, что это сработает. Но поскольку вы предполагаете, что имеете дело с байтовым массивом, размер добавляемых вами данных может быть вам уже известен. Вам также нужно будет рассмотреть вопрос о том, хотите ли вы рассмотреть любые издержки. Объект занимает некоторое пространство, как и сама ссылка внутри самой очереди. Плюс объект очереди. Вы могли бы определить точные значения для этого, но, поскольку вам кажется, что ваше требование состоит только в том, чтобы предотвратить outofmemory, вы, вероятно, можете просто использовать приблизительные оценки для тех, пока вы согласны.

Сведения о том, какой класс очереди вы хотите использовать в подклассе, зависит от того, насколько сильно вы считаете, что между потоками будет существовать. Но похоже, что у вас есть проблема с синхронизацией.

Смежные вопросы