0

我使用Java 多线程和并发工具相对较新。我正在实现一个具有事件生产者的应用程序(我们称之为EventProducer)。EventProducer有一个线程池FixedThreadPool,每个要处理的事件发送一个新EventProcessor线程,向池提交一个新线程。

一切正常,每个事件都在池中创建一个线程。但是问题是我想将该EventProcessor线程(特定于每个事件请求)与两个应该是应用程序范围的线程进行通信,我的意思是,我在应用程序中只有一个它们的实例,比如说Service1and Service2。它们都有线程池,能够同时处理任务。

该特定EventProcessor发送任务集Service1并返回每个任务的响应。对于这些响应,我一直在寻找CompletionService但我不知道如何将它与阻塞队列集成以进行双向通信。之后,根据该响应,EventProcessor发送一个或另一个动作以在 中执行Service2Service2还将向 发送有关该操作的响应EventProcessor

有人知道我该如何解决这样的问题吗?为了实现第一步,我需要一个介绍。汇集你的想法。

4

4 回答 4

3

线程间通信的最佳对象是BlockingQueue. 它们超级灵活且线程安全,通常可以处理所有要求。

BlockingQueue<Task> queue = new LinkedBlockingQueue<>();
于 2013-02-18T16:41:40.320 回答
1

让你 Service1 和 2 成为ExecutorServices。您的 EventProcessor 使用封装您的响应的返回类型 R 以 Callables 的形式向 Service1 发送任务。它还将生成的期货排队。在另一个线程中,您收到这些响应并将新的可调用对象分派给 Service2。您也可以为此使用 CompletionService。

于 2013-02-18T16:59:34.013 回答
1

如果您的事件调度程序线程中有一个非阻塞队列,例如ConcurrentLinkedQueue怎么办。然后,您将对此的引用传递给您的Callable,以便它可以将响应添加到队列中。
然后,在您的事件调度程序中,您可以定期轮询队列以查看其中是否有任何有趣的内容。由于队列是非阻塞的,它只会null在它为空时返回。

于 2013-02-18T17:08:13.923 回答
1

最后我设法通过以下方式解决它:EventProducer创建服务Service1Service2,它们是可运行的对象,并将它们作为线程启动。这些服务中的每一个都在其池中等待结果,该池被实现为CompletionService. 这些服务引用被保存EventProducer并通过引用传递给 every EventProcessor,这是在事件启动时创建的。

EventProcessor有两个BlockingQueue元素,每个元素都用于接收来自服务的响应。当我想调用一个服务时,我通过对象的引用来完成它并调用服务的调度方法,传递我想要处理的元素集合作为参数以及EventProcessor它自身的引用。该调用是在 的线程之后完成的EventProcessor,但它只为每个要处理的对象创建一个可调用对象,将代码执行到服务类中,该类将新线程提交到他的池中。

当结果给出时,在他自己的线程中等待它的服务将它放入 的BlockingQueueEventProcessor,因为它有他的引用。AfterEventProcessor将结果管理到他自己的线程中(并且可以将其他操作发送到其他服务)。

就是这样,非常感谢人们的帮助,你有你的支持,因为每个答案都澄清了我的一些概念。

于 2013-02-20T09:19:19.367 回答