每隔一段时间消耗 N 个记录的使用者线程



我正在设计场景,其中 5 个线程将从Executor发布到 Queue1。 此队列有一个使用者 1,它需要使用 5K 记录并进入睡眠状态 10 毫秒,然后再次执行相同的过程。 这是必需的,因为此使用者将再次将记录发布到另一个队列 Queue2,而我不想将负载放在第二个队列 2 上。

如何处理 consumer1,以便它可以处理 5K 记录并休眠 10 毫秒?

请注意,Queue1 是像 li med list 这样的无限队列,因为如果消费者速度很慢,我们不想阻止 5 生产者。 此外,生产者可以并行处理,而不是等待 5K reva 然后批量排水。所以我认为如果我使用原子计数器,那就没问题了。 将来可能会有多个生产者,但现在它只有一个,所以我使用执行器在更安全的一面生产。 但是有没有更好的API?

您可以使用java.util.concurrent.BlockingQueue的实现,并将多达 5K 个元素排放到您的工作线程,然后暂停 10 毫秒:

blockingQueue.drainTo(outputList, 5000);
Thread.sleep(10);
// Continue with your work

如果队列中没有足够的元素,则可能是迭代过于频繁。在这种情况下,您可能需要执行以下操作:

outputList.add(blockingQueue.take()); // thread will wait here for new elements

if (outputList.size() == 5000){
Thread.sleep(10);
// Clear outputlist and continue with your work
}

最新更新