我有一些关于“消息循环”的理论问题;特别是返回在不同线程中运行的消息循环中发生的操作结果。我有一个情况,我有一个TCP服务器侦听传入的消息。对于每个传入消息,服务器将验证发送消息的客户端,并且可能发生两件事:
处理程序当前是一个实现Callable接口的对象,因此它将在另一个线程中运行,并且它足够简单以获取操作的结果。现在我的问题是:每个处理程序可以处理N条消息。处理程序有一个“消息循环”,其功能一直运行直到发生超时 - 在这种情况下,超时是套接字的空闲时间达到预定义的阈值。我想知道的是,如何让Java从消息循环中返回一个值而不实际终止该线程。如下所示:
while (true) {
if (expired(socket))
break; // the callable will finish the call() method.
// get the first item from the queue.
message = messageQueue.poll();
result = process(message);
// I want to return the result to the caller which is in a different thread.
}
现在显然一个return语句会停止消息循环,如果messageQueue包含更多消息,它们将会丢失。另一种天真的方法是使用类似回调的机制,这需要一个额外的对象+我仍然需要在后台线程中将调用者与Callable同步。像wait&amp ;;虽然我有K个线程在后台运行,但通知。
在不终止线程本身的情况下,处理从不同线程中的消息循环中返回操作结果的这种情况的复杂方法是什么?
@Edit: 我将对整个过程进行描述,以便澄清这里发生的事情。
因此调用者就像Dispatcher一样,将消息分派给正在运行与消息发送者关联的处理程序的线程。它还收集处理程序的响应并将它们发送回正确的客户端。
每个处理程序当前都有自己的消息队列,其中只推送特定句柄必须处理的那些消息。当处理程序启动时,它将打开一个TCP套接字到目标系统,在这些套接字中,它们将在应用转换后转发传入的消息。当处理程序达到最大允许空闲时间(套接字打开而不发送请求)时,套接字将被关闭并且消息循环停止。此时处理程序将完成其执行。这样做的目的是为每个客户提供一个套接字,通过它可以发送多个请求,而无需目标系统进行另一次身份验证。
答案 0 :(得分:1)
很少有选项/问题浮现在脑海:
终止线程是否有问题,检查返回的结果然后将此任务重新提交到同一个线程池?您将获得结果,进行分析,然后重新提交到池并继续工作
当这个线程运行时,它可以将状态提交给在该线程外部分析的不同("外部")队列。一个独立的线程总是运行并检查此队列
据我所知,如何...
答案 1 :(得分:0)
如果要返回简单类型,可以使用thead安全结果队列(全局或调用者)。 在你的情况下,线程池更合适。
我相信最普遍的方式是回调机制。