Там не из функциональных возможностей коробки для этого в Java. (Отчасти потому, что нет простого способа узнать, добавлены ли объекты, добавленные в коллекцию, в другом месте, и поэтому, если их добавление занимает дополнительную память.)
Для вашего варианта использования вы, вероятно, лучше всего просто подклассифицируете очередь. Переверните супер, чтобы добавить размер объекта в счетчик (очевидно, вам нужно будет сделать этот поток потоков безопасным.) И выбросить исключение IllegalStateException, если в нем нет места. Аналогичным образом уменьшите свой счетчик, если на переопределенном классе remove.
Метод определения того, как много места для добавления в счетчик может отличаться. Фарлан предложил использовать this, и похоже, что это сработает. Но поскольку вы предполагаете, что имеете дело с байтовым массивом, размер добавляемых вами данных может быть вам уже известен. Вам также нужно будет рассмотреть вопрос о том, хотите ли вы рассмотреть любые издержки. Объект занимает некоторое пространство, как и сама ссылка внутри самой очереди. Плюс объект очереди. Вы могли бы определить точные значения для этого, но, поскольку вам кажется, что ваше требование состоит только в том, чтобы предотвратить outofmemory, вы, вероятно, можете просто использовать приблизительные оценки для тех, пока вы согласны.
Сведения о том, какой класс очереди вы хотите использовать в подклассе, зависит от того, насколько сильно вы считаете, что между потоками будет существовать. Но похоже, что у вас есть проблема с синхронизацией.
вы можете сделать что-то вроде описанного здесь: http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an- object – Farlan
Не похоже на то, что ArrayBlockignQueue включает эту функцию. (Кажется, у него есть фиксированный элемент, а не фиксированный размер.) –