У меня есть 1 основной поток, который запускает n
дочерние потоки. Каждый из этих дочерних потоков постоянно создает новое событие и добавляет его в общую очередь. Это событие представляет собой последнее состояние сложного вычисления для дочернего потока.Параллельная очередь на Java, которая сохраняет только последний элемент каждого дочернего потока
Главный поток потребляет эту общую очередь, но не заинтересован в обработке всех событий, все еще находящихся в очереди: если один дочерний поток отправил 3 очереди в очередь, основной поток интересует только последний. Более старые события этого дочернего потока можно отбросить (как только дочерний поток добавит новое событие).
Например:
childThread A adds event A1
mainThread removes event A1
childThread B adds event B1
childThread B adds event B2 // => B1 should be discarded
childThread B adds event B3 // => B2 should be discarded
mainThread removes event B3
childThread A adds event A2
childThread A adds event A3 // => A2 should be discarded
childThread B adds event B4
mainThread removes event A3
mainThread removes event B4
childThread B adds event B5
childThread A adds event A4
childThread A adds event A5 // => A4 should be discarded
childThread B adds event B6 // => B5 should be discarded
childThread A adds event A6 // => A5 should be discarded
mainThread removes event B6 // do B6 first because B5 was before A4
mainThread removes event A6
Дополнительное требование: Основной поток действительно хочет круговой системе как можно более событий дочерних потоков, но по-прежнему блокировать, если ни один из дочерних потоков не производят.
Не должно быть 'wasConsumed = true', а удаление этого узла из очереди должно быть в одном и том же« синхронизированном »блоке (так что добавление не может пересекаться в состоянии гонки)? –
Нет. Даже если он был удален из очереди, он все равно может быть обновлен, если потребитель не начал его потреблять. – Shloim