Я реализую то, что я бы назвал «Наблюдаемый набор». Это просто обычный набор, но у него могут быть некоторые наблюдатели, которые уведомляются о добавлении новых элементов.
Что важно для меня, так это то, что элементы могут быть добавлены из многих потоков одновременно, а также есть много потоков наблюдения. Я держу наблюдателей в CopyOnWriteArrayList (это потокобезопасно). Ключевым моментом является информирование наблюдателей о добавлении элементов таким образом, чтобы порядок информирования каждого из наблюдателей был таким же, как и порядок добавления элементов.
Каков наилучший подход?
Самый наивный - поместить добавление и информирование в "синхронизированный" блок. Но я считаю, что это может быть медленным и т. д.
Во-вторых, я пытался просто добавить элемент в набор и добавить его в «очередь информирования». При каждом добавлении элемента проверялось, включено ли информирование. Если нет, то он запускался до тех пор, пока очередь не опустеет. Это работало вполне нормально, но я боялся, что это нехороший подход.
Последнее, что я реализовал, я бы назвал «информирующими потоками». При добавлении наблюдателей у каждого наблюдателя создается собственный «поток информирования». Этот поток работает в фоновом режиме и проверяет, находится ли он в конце глобальной «очереди информирования». Если это не так, он информирует конкретный поток о новых элементах. Однако у меня проблемы с синхронизацией и циклом while(true). Я не знаю, как установить условие для завершения потока. Следующая проблема, которую я заметил при написании, заключается в том, что каждый новый поток будет проинформирован с самого начала... Это нехорошо.
Надеюсь, я достаточно хорошо все описал. Если нет, дайте мне знать, я постараюсь исправить. Как лучше всего выполнить эту задачу? Спасибо!