У меня есть два потока. Производитель создает куски данных (объекты String), где потребитель обрабатывает эти строки. Уловка в том, что моему приложению нужен только последний обработанный объект данных. Другими словами, если производителю удалось создать две строки «s1», а затем «s2», то я хочу, чтобы потребитель обрабатывал только «s2». «s1» можно безопасно отбросить.Передача рабочего элемента между потоками (Java)
Конечно, нет проблем с реализацией класса, который реализует это поведение, но я хочу использовать стандартный механизм из java.util.concurrent (если такой механизм существует). Обратите внимание, что SynchronousQueue не является хорошим решением: потребитель будет блокировать при запуске «s1» и не получит возможности произвести «s2».
(Короче говоря, я ищу для коллекции одного элемента с блокирующим удалить операцию и неблокирующая множественная операция)
Есть идеи?
Есть ли действительно состояние гонки? Я думаю, что ReentrantLock внутри ArrayBlockingQueue должен их избегать. –
@Errandir - состояние гонки, о котором я говорил, было, когда в очереди был элемент, ожидающий очереди, и потребитель берет этот элемент непосредственно перед тем, как производитель добавит новый элемент. Это из-за отсутствия лучшего термина - «макро-расы», которое происходит за пределами любой структуры данных, которую вы используете. – kdgregory