Java 两个不同执行块之间的同步器

Java 两个不同执行块之间的同步器,java,multithreading,synchronize,synchronized-block,Java,Multithreading,Synchronize,Synchronized Block,消息处理任务在检测到客户端登录任务时应停止处理新消息。但是,消息处理器应该在暂停之前完成它正在处理的任务。这基本上意味着客户端登录任务应该给消息处理器一个喘息的空间(等待本身),然后才能继续。所以情况是这样的 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

消息处理任务在检测到客户端登录任务时应停止处理新消息。但是,消息处理器应该在暂停之前完成它正在处理的任务。这基本上意味着客户端登录任务应该给消息处理器一个喘息的空间(等待本身),然后才能继续。所以情况是这样的

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.
我的问题是,这两个线程之间是否有现成的同步器,它们执行不同的路径,但必须相互等待?我的理解是循环屏障、信号量、倒计时锁存器在相同执行路径的线程之间进行同步

编辑-只有一个消息处理线程。但是,可以有多个登录线程

我想到的解决方案是使用可重入锁。因此,在处理每条消息之前,将获取一个锁,消息处理器将检查是否有任何正在进行的客户端登录。AtomicInteger告诉我正在进行的登录请求数。如果有多个登录请求正在进行,通知处理器将等待锁定条件。通知处理器恢复工作的条件是原子整数计数必须降到0。 解决方案唯一的警告是,如果消息正在处理,登录请求出现在中间,那么登录线程不等待。这就是我在客户端登录上需要另一个锁的地方,必须在消息处理器处理完消息后释放该锁。这使得解决方案过于复杂,我希望避免这种不必要的复杂性。
感谢您的建议。

使用
信号量的简单方法是在登录/消息处理任务之间共享一个。如果消息处理线程处于任务的中间,则在登录任务可以处理之前完成(公平性将保证登录任务将立即执行)。

如果有多个消息处理线程,此方法将不起作用。

不确定我是否正确选择了此方法,但我将使用带有单个线程的
ThreadPoolExecutor
,在其中传递
PriorityBlockingQueue
。您的所有任务都将进入该队列,登录任务将具有更高的优先级,因此它们都将在任何
消息处理任务之前被处理


另外,如果正在执行
消息处理任务
,它将在
客户端登录任务
开始之前完成。这就是您所需要的吗?

嗯,任何放在全局位置的线程都可以被两个单独的线程引用(和使用)。只有一个消息处理线程。但是可能有多个客户端登录线程。那么这个解决方案一次只允许一个客户端登录,这不是很有效。我实现了使用PriorityQueue的方法。不知何故,单客户端登录活动是一个可接受的解决方案。很多thnx!