Вы можете переопределить методы beforeExecute и afterExecute, чтобы сообщить, что задача запущена и завершена. Вы можете переопределить execute (), чтобы знать, когда добавляется задача.
Проблема, с которой вы столкнулись, заключается в том, что очередь не предназначена для запроса, и задание может быть использовано до того, как вы его увидите. Одним из способов решения этой проблемы является создание собственной реализации очереди (возможно, переопределение / обертывание ConcurrentLinkedQueue)
Кстати: очередь является поточно-ориентированной, однако не гарантируется, что вы увидите каждую запись.
ConcurrentLinkedQueue.iterator () задокументирован как
Возвращает итератор для элементов в этой очереди в правильной последовательности. Возвращенный итератор является «слабосогласованным» итератором, который никогда не вызовет исключение ConcurrentModificationException, и гарантирует прохождение элементов в том виде, в каком они существовали при создании итератора, и может (но не гарантируется) отражать любые модификации, следующие после построения.