2013-02-18 49 views
0

我是比较新的使用Java多线程和并发工具。我正在实施一个包含活动制作人的应用程序(我们称之为EventProducer)。 EventProducer有一个线程池FixedThreadPool,其中每个要处理的事件都有一个新线程被发送,向线程池提交一个新的EventProcessor线程。Java多线程通信

这样就行了,池中的线程正在为每个事件创建。但问题是,我想通过线程(这是针对每个事件请求)与两个应该是应用程序范围的线程通信EventProcessor,我的意思是,在应用程序中只有它们的一个实例,比如Service1Service2。它们都有线程池,可以同时处理任务。

该特定EventProcessor将任务组发送到Service1并且它返回每个任务的响应。对于这种回应,我寻找CompletionService,但我不知道如何将它与Blocking queues集成进行双向通信。之后,根据该响应,EventProcessor发送一个或另一个动作以在Service2中执行。 Service2也会向EventProcessor发送有关该操作的响应。

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

+0

@ jtahlborn,您的评论并没有真正为他/她的问题添加任何价值! – 2013-02-18 16:44:24

+0

@jtahlborn我一直在看几个小时的例子,我试着让我的问题具体到足以写在这里。 – 2013-02-18 16:47:37

+0

@ user717630其实,它是。 OP想要为每个事件创建新线程。他的线程Service1和Service2有线程池。所以也许他在这里混淆了一些术语。 – 2013-02-18 16:49:14

回答

1

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

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

当给出结果时,在自己的线程中等待它的服务将它放入EventProcessorBlockingQueue中,因为它有他的参考。在EventProcessor之后,将结果管理到他自己的线程中(并可以将其他操作发送到其他服务)。

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

3

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

BlockingQueue<Task> queue = new LinkedBlockingQueue<>(); 
1

让你服务1和2为ExecutorService s。 EventProcessor使用封装响应的返回类型R以可调参数形式向Service1发送任务。它也将产生的期货排队。在另一个线程中,您会收到这些响应并向Service2发送新的可调用对象。您也可以为此使用CompletionService。

+0

因此,您的建议是创建另一个线程,将新请求分派到'Service2'?你认为我最好不要使用'EventProcessor'来完成这项工作? – 2013-02-18 17:03:44

+0

您似乎有一个处理管道,其中作业来自无处不在您的EventProcessor,然后到Service1,然后可能到Service2。这*可能*应该由另一个线程处理。你也可以将你的Service1作业包装到Runnables中,为你的Eventprocessor创建新的事件,并将它们放入与原始作业相同的队列中。但是你必须决定Service1和Service2是什么。 – 2013-02-18 17:08:23

1

如果在事件分派器线程中有非阻塞队列,例如ConcurrentLinkedQueue,该怎么办?然后,您将参考传递到您的Callable,以便它可以将响应添加到队列中。
在您的事件调度程序中,您可以定期轮询队列以查看它是否有任何有趣的内容。由于队列是非阻塞的,因此当队列为空时,它会返回null