編集:あなたの新しい説明に基づいて、私はあなたが間違った質問をしていると信じています。エグゼキュータを使用している場合は、キューを変更するのではなく、カスタムのRejectedExecutionHandlerを定義する必要があります。これは、ThreadPoolExecutorを使用している場合にのみ機能しますが、使用していない場合は、キューではなくエグゼキューターを変更することをお勧めします。
オファーをオーバーライドして追加のように動作させるのは間違いだと私は思います。インターフェイスメソッドはコントラクトを構成します。ブロッキングキューを使用するクライアントコードは、ドキュメントで指定されていることを実際に実行するメソッドによって異なります。そのルールを破ると、傷ついた世界が開かれます。それ、そしてそれはエレガントではありません。
BlockingQueuesのadd()メソッドはそれを行いますが、一般的にはより良い選択であるoffer()メソッドもあります。offer()のドキュメントから:
キューの容量を超えずにすぐに実行できる場合は、指定された要素をこのキューの末尾に挿入します。成功するとtrueを返し、このキューがいっぱいの場合はfalseを返します。このメソッドは、例外をスローするだけで要素の挿入に失敗する可能性があるメソッド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