从多个线程中读取一个java.util.arrayqueue

时间:2012-04-20 20:17:56

标签: java

问题,一个进程程序的多个线程可以从一个静态java.util.arrayqueue顺序读取?如果进程程序的三个线程正在运行并且三个数据对象到达数组,则每个线程将处理一个数据对象,或者只有一个线程将处理所有三个数据对象

4 个答案:

答案 0 :(得分:1)

您正在描述生产者 - 消费者模式。

几点

  • 如果你产生三个线程并且它们各自循环,读取相同的队列,那么它们都将尝试使用队列中的项目。无法保证每个线程将消耗多少项。这完全取决于JVM(或OS级别)中线程的调度程序。一般来说,如果队列中添加了大量类似的项目,每个线程将消耗大致相同数量的项目。

  • ArrayQueue不是这个用例的好选择,因为它不是线程安全的。更好的选择是ConcurrentLinkedQueue或ConcurrentBlockingQueue

要直接回答您的问题,是的,您可以从同一个队列中读取多个线程,但请考虑以上内容。

答案 1 :(得分:0)

通常,您希望使用同步线程,每个线程读取1个输入。

要回答您的问题,无法确定此上下文中的行为。您应该强制线程同步,以确保每个线程始终忙,而不仅仅是一个。

答案 2 :(得分:0)

在这种情况下,您确实想要使用同步或切换到更合适的数据结构。

来自arrayqueue的文档: 它们不是线程安全的;在没有外部同步的情况下,它们不支持多线程的并发访问

答案 3 :(得分:0)

假设arrayqueue push / pop是线程安全的,并且使用的任何信令都不会限制正在运行的线程数:

取决于可用的核心数以及线程处理数据的速度。如果有三个空闲核心并且排队的任务需要一些时间,则三个线程可以同时运行这三个任务。如果任务非常简短并且系统上存在一些负载,使得在数据提交时只有一个线程是空闲的,则一个线程可以在另一个线程变为可用之前围绕并执行所有三个项目。如果内核少于任务,那么显然只有[没有。核心]任务可以同时运行。

混合并匹配这些可能性。