Java多线程通信

时间:2013-02-18 16:36:58

标签: java multithreading

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

没关系,每个事件到达时都会创建池中的线程。但问题是我希望将EventProcessor线程(特定于每个事件请求)与两个应该作为应用程序作用域的线程进行通信,我的意思是,我在应用程序中只有它们的一个实例,我们说Service1Service2。它们都有线程池,以便能够同时处理任务。

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

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

4 个答案:

答案 0 :(得分:3)

线程间通信的最佳对象是BlockingQueue。它们具有超级灵活性和线程安全性,通常可以满足所有要求。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

这就是全部,非常感谢人们的帮助,你们的赞成,因为每个答案都澄清了我的一些概念。