我使用 Java多线程和并发工具相对较新。我正在实现一个具有事件生成器的应用程序(我们称之为EventProducer
)。 EventProducer
有一个线程池FixedThreadPool
,其中每个要处理的事件都有一个新线程被发送,向池中提交一个新的EventProcessor
线程。
没关系,每个事件到达时都会创建池中的线程。但问题是我希望将EventProcessor
线程(特定于每个事件请求)与两个应该作为应用程序作用域的线程进行通信,我的意思是,我在应用程序中只有它们的一个实例,我们说Service1
和Service2
。它们都有线程池,以便能够同时处理任务。
特定EventProcessor
将任务集发送到Service1
,并返回每个任务的响应。对于这些回复,我查找了CompletionService,但我不知道如何将其与Blocking queues集成以进行双向通信。之后,EventProcessor
根据该响应发送一个或另一个操作,以便在Service2
中执行。 Service2
还会向EventProcessor
发送有关该操作的回复。
有人知道我该如何解决这个问题?我需要一个介绍才能实现第一步。汇集你的想法。
答案 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
创建服务Service1
和Service2
,它们是可运行的对象,并将它们作为线程启动。这些服务中的每一个都在其池上等待结果,该池实现为CompletionService
。这些服务引用保留在EventProducer
中,并通过引用传递给每个EventProcessor
,这是在启动事件时创建的。
EventProcessor
有两个BlockingQueue
元素,每个元素用于接收来自服务的响应。当我想调用服务时,我通过对象的引用来执行它并调用服务的dispatch方法,传递我想要作为参数处理的元素集合以及EventProcessor
本身的引用。调用是在EventProcessor
的线程之后完成的,但它只为每个要处理的对象创建一个可调用对象,将代码执行到服务类中,该服务类将新线程提交给他的池。
当给出结果时,在他自己的线程中等待它的服务将其放入BlockingQueue
的{{1}},因为它有他的引用。在EventProcessor
将结果管理到自己的线程之后(并且可以将其他操作发送到其他服务)。
这就是全部,非常感谢人们的帮助,你们的赞成,因为每个答案都澄清了我的一些概念。