当检测到客户端登录任务时,消息处理任务应该停止处理新消息。但是,消息处理器应该在暂停之前完成它正在处理的任务。这基本上意味着客户端登录任务应该给消息处理器一个喘息的空间(等待自己),然后才能继续。所以场景是这样的
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.
我的问题是,这两个线程之间是否有任何现成的同步器正在执行不同的路径但必须相互等待?我的理解是循环障碍、信号量、CountDownLatch 在处于相同执行路径的线程之间同步。
编辑-有一个消息处理线程。但是,可以有多个登录线程。
我想到的解决方案是使用可重入锁。所以在处理每条消息之前会发生什么,获取一个锁并且消息处理器检查是否有任何正在进行的客户端登录。AtomicInteger 告诉我正在进行的登录请求数。如果有多个登录请求正在进行,通知处理器等待锁定条件。通知处理器被通知恢复其工作的条件是 AtomicInteger 计数必须降至 0。解决方案的唯一警告是,如果正在处理消息并且登录请求出现在中间,那么登录线程不等待。这就是我需要在客户端登录上的另一个锁定,当消息处理器处理完消息时必须释放它。这使得解决方案过于复杂,我想避免这种不必要的复杂性。任何建议表示赞赏。