Прежде всего, вам необходимо уточнить семантику вызовов на add
, pendingRecords
и removeUntil
, когда происходит одновременный вызов shutdown
. В текущей реализации эти вызовы будут блокироваться до тех пор, пока не вернется shutdown
, но после этого они будут счастливо продолжены. Может быть, в этом случае было бы лучше бросить IllegalStateException
. Но это действительно зависит от ваших требований.
Чтобы улучшить аспект параллелизма, я бы отделил проблему жизненного цикла shutdown
от остальной логики приложения. Например, вы можете изменить q
с Queue<String>
на AtomicReference<Queue<String>>
. Вызов shutdown
затем установит эту ссылку на реализацию Queue
, которая будет представлять происходящее завершение работы и, например, киньте IllegalStateException
с на все их методы. В зависимости от точной семантики, которую вы требуете, есть еще и другие проблемы, связанные с параллелизмом, чтобы потом разобраться. Например. Это нормально для removeUntil
, чтобы начать сбой в середине цикла? Если нет, то этот метод должен был бы работать из локальной копии очереди, полученной при входе в метод.