0

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

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。解决方案的唯一警告是,如果正在处理消息并且登录请求出现在中间,那么登录线程不等待。这就是我需要在客户端登录上的另一个锁定,当消息处理器处理完消息时必须释放它。这使得解决方案过于复杂,我想避免这种不必要的复杂性。任何建议表示赞赏。

4

2 回答 2

1

一个简单的方法Semaphore(1 个许可,公平公正)是在登录/消息处理任务之间共享一个。如果消息处理线程处于任务的中间,它将在登录任务处理之前完成(公平性将保证登录任务将在之后立即执行)。

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

于 2014-11-28T08:24:42.660 回答
1

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

此外,如果message-processing-task正在进行中,它将在client-login-tasks开始之前完成。那是您需要的吗?

于 2014-11-28T09:49:56.397 回答