Java 使用者线程以间隔消耗N个记录

Java 使用者线程以间隔消耗N个记录,java,multithreading,java-8,executorservice,producer-consumer,Java,Multithreading,Java 8,Executorservice,Producer Consumer,我正在设计一个场景,其中来自Executor的5个线程将发布到Queue1。 此队列中有一个consumer1,它需要消耗5K REC并进入睡眠状态10毫秒,然后再次执行相同的过程。 这是必需的,因为此使用者将再次将记录发布到另一个队列Queue2,并且我不想在第二个队列2上加载 如何处理consumer1,使其能够处理5K记录并休眠10毫秒 请注意,Queue1是无界队列,类似于li med列表,因为如果消费者速度慢,我们不想阻止5生产者。 此外,生产商可以并行处理,而不是等待5K reva,

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

如何处理consumer1,使其能够处理5K记录并休眠10毫秒

请注意,Queue1是无界队列,类似于li med列表,因为如果消费者速度慢,我们不想阻止5生产者。 此外,生产商可以并行处理,而不是等待5K reva,然后批量排放。所以我想如果我用原子计数器,那就可以了。 未来可能会有多个制作人,但目前只有一个,所以我也在使用executor进行更安全的制作。
但是有更好的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
  }

您可以使用
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
  }

@维克托,对不起,我没提到这是无界队列。为了更清楚,我编辑了这个问题。我们不必等5公里。这里我的线程将等待5K可用。简言之,它可以继续下去。完成5K后,生产商可以暂停。您好,这很好,默认情况下BlockingQueue是无限制的。此外,它准备好让多个生产者/消费者并行(它是并发的,线程安全的)谢谢!我同意你的方法,但我不想等5公里。因为如果那样的话,拖入将是最好的选择IMHO@Yoxi,如果这对您有帮助,请接受并投票,谢谢@维克托,对不起,我没提到这是无界队列。为了更清楚,我编辑了这个问题。我们不必等5公里。这里我的线程将等待5K可用。简言之,它可以继续下去。完成5K后,生产商可以暂停。您好,这很好,默认情况下BlockingQueue是无限制的。此外,它准备好让多个生产者/消费者并行(它是并发的,线程安全的)谢谢!我同意你的方法,但我不想等5公里。因为如果那样的话,拖入将是最好的选择IMHO@Yoxi,如果这对您有帮助,请接受并投票,谢谢!