繁体   English   中英

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

[英]read one java.util.arrayqueue from more than one thread

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

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

几点

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

  • 对于这种用例,ArrayQueue不是线程安全的,因此不是一个很好的选择。 更好的选择是ConcurrentLinkedQueue或ConcurrentBlockingQueue

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

通常,您要使用同步线程,以便每个线程读取1个输入。

要回答您的问题,无法确定这种情况下的行为。 您应强制线程同步,以确保每个线程始终处于繁忙状态,而不仅仅是一个。

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

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

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

取决于可用的内核数量以及线程可以处理数据的速度。 如果有三个空闲核心,并且排队的任务需要花费一些时间,则三个线程可能很好地同时运行这三个任务。 如果任务很短,并且系统上有一些负担,使得在提交数据时只有一个线程可用,则一个线程可能会争用并执行所有三个项目,然后另一个线程可用。 如果核心少于任务,那么显然只有[否。 [核心数量]任务可以同时运行。

混合并匹配这些可能性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM