Задача обработки сообщений должна прекратить обработку НОВОГО сообщения, когда оно обнаруживает задачу входа-клиента. Однако обработчик сообщения должен завершить задачу, которую он обрабатывал, перед приостановкой. Это в основном означает, что задача клиентского входа должна дать процессору сообщений пространство для передышки (ожидание), прежде чем оно сможет продолжить. Таким образом, сценарий этоСинхронизаторы между двумя различными исполнительными блоками
1) message-processing-task is processing messages from a queue (one at a time)
2) It detects a client-login in the middle of processing a message
3) message-processing-task should complete processing the message before it waits for the client-login-task to complete. This is where the client-login-task must wait.
4) client-login-task complete and signals message-processing-task
5) message-processing-task goes about its business.
Мой вопрос, есть ли готовые синхронизаторы между этими двумя нити, проводящие различные пути и все же должны ждать друг от друга? Мое понимание - Cyclic Barrier, Semaphore, CountDownLatch синхронизировать между потоками, которые находятся на одном пути выполнения.
EDIT- Существует один поток обработки сообщений. Тем не менее, может быть несколько потоков входа.
Решение, которое я имею в виду, это использовать блокировку ретентата. Итак, прежде чем обрабатывать каждое сообщение, происходит блокировка, и процессор обработки сообщений проверяет, есть ли какой-либо вход в систему клиента. AtomicInteger сообщает мне количество выполненных запросов на вход в систему. Если в настоящее время выполняется более одного запроса на вход, процессор уведомлений ожидает в состоянии блокировки. Условие, на которое уведомление-процессор сигнализируется о возобновлении своей работы, заключается в том, что счетчик AtomicInteger должен опуститься до 0. Единственное предостережение с решением заключается в том, что сообщение обрабатывается, и запрос на вход приходит в середине этого, то нить входа не ждет. Вот где мне понадобится еще одна блокировка на клиенте-входе, который должен быть выпущен, когда обработчик сообщения обработал сообщение. Это делает решение слишком сложным, и я хотел бы избежать этой ненужной сложности. Любые предложения оценены.
Ну, любые из размещенных в глобальном местоположении могут ссылаться (и использоваться) на два отдельных потока. – markspace