Редактировать: Исходя из вашего нового описания, я считаю, что вы задаете неправильный вопрос. Если вы используете Executor, вы, вероятно, должны определить пользовательский RejectedExecutionHandler вместо изменения очереди. Это работает только в том случае, если вы используете ThreadPoolExecutor, но если это не так, вероятно, было бы лучше изменить Executor, а не очередь.
По моему мнению, было бы ошибкой переопределять предложение и заставлять его вести себя как добавление. Интерфейсные методы составляют контракт. Код клиента, который использует блокирующие очереди, зависит от методов, которые фактически выполняют то, что указано в документации. Нарушение этого правила открывает мир боли. И это не элегантно.
Метод add () в BlockingQueues делает это, но у них также есть метод offer () , который обычно является лучшим выбором. Из документации к предложению ():
Вставляет указанный элемент в
хвост этой очереди, если это возможно
сделать это немедленно, не превышая
емкость очереди, возвращая истину
в случае успеха и ложь, если эта очередь
полный. Этот метод обычно
предпочтительнее метода add (E), который может
не удается вставить элемент только
бросить исключение.
Это работает для всех таких очередей независимо от конкретной реализации (ArrayBlockingQueue, LinkedBlockingQueue и т. Д.)
BlockingQueue<String> q = new LinkedBlockingQueue<String>(2);
System.out.println(q.offer("foo")); // true
System.out.println(q.offer("bar")); // true
System.out.println(q.offer("baz")); // false