ReentrantLock with priorities for waiting threads
After calling shutdown(), the shutdown boolean may never get checked. The Thread may be stuck in waitingQueue.take().

It's probably not a good idea to catch and swallow InterruptedException.

Considering those two points together, it makes sense to remove the Thread and use Executors.newSingleThreadExecutor() instead, and delegate to its shutdown() method.

Finally, it's fairly low-level and error prone to use wait() and notifyAll(). Using notify() is even riskier than notifyAll(). I'd recommend using a Condition instead.