我在读blockingqueue,ExecuteService和生产者-消费者范式。我希望有一个不断变化的生产者数量,和不断变化的消费者数量。每个生产者将附加到队列中,消费者将使用消息并对其进行处理。我的问题是-生产者如何知道消费者已经完成了,而不再有消息进入队列?我想在我的主线程中添加一个计数器。当一个producer启动时,我将增加计数器,当每个producer结束时,他们将减少int。我的消费者将能够知道计数器,当计数器达到0,并且队列中没有更多的元素时,他们可以死亡。
关于同步工作的另一个一般性问题是:主线程应该读取队列的内容,并为每条消息添加执行器,还是让线程知道这个逻辑并自行决定何时终止是最佳做法?
当系统启动时,我会收到一个数字,决定有多少生产商将启动。每个生产者将在队列中生成一组随机数字。消费者将把这些数字打印到日志中。我面临的问题是,一旦我知道最后一个生产商推出了最后一个数字,我仍然不明白如何让消费者知道,不会再有更多的数字进来,他们应该关闭。
消费者怎么知道生产者什么时候完蛋了?
2条答案
按热度按时间dtcbnfnu1#
当生产者完成,最后一个可以中断所有消费者和(可能)生产者。
InterruptedException
每当阻塞调用(无论是put()
或者take()
)被另一个线程通过thread.interrupt()
,在哪里thread
是调用该方法的线程。当最后一个生产者完成时,它可以中断所有其他线程,这将导致所有阻塞方法抛出InterruptedException
,允许您终止相应的线程。yqhsw0fo2#
一个优雅的解决方案是使用毒丸模式。下面是一个如何工作的例子。在这种情况下,你只需要知道生产商的数量。
编辑:我更新了代码,以便在最后一个消费者完成工作时清除队列。