Still not sure why leaving
Metric first = queue.poll(maxWaitMillis, TimeUnit.MILLISECONDS);
doesn't work.  It handles the wait, no explicit sleep, and what you do with results just has to be threadsafe.