ArrayBlockingQueue - blocking drainTo() method
Your problem is easily solved without having to delve in to the internals of ArrayBlockingQueue, and without needing a new ReEntrantLock either. SImply use the methods that are currently available, and combine them....

public int drainAtLeastOneTo(Collection&lt;? super E&gt; c) 
        throws InterruptedException {
    c.add(take());
    return 1 + drainTo(c);
}