Потоки имеют механизм ожидания-уведомления.Когда поток ожидает, он фактически спит.Получив уведомление, он просыпается и возвращается к работе.
Реализации BlockingQueue заставляют потоки опроса ждать, если нет элементов для обслуживания, и уведомляют все спящие потоки, когда вставляется новый элемент.Эти потоки затем просыпаются и могут взять только что вставленный элемент.
Более подробную информацию об этом механизме можно найти здесь (или путем поиска в Google).