0

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

4

4 回答 4

1

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

几点

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

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

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

于 2012-04-20T20:25:16.570 回答
0

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

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

于 2012-04-20T20:22:30.117 回答
0

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

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

于 2012-04-20T20:28:52.297 回答
0

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

取决于可用的内核数量以及线程处理数据的速度。如果有 3 个空闲内核并且排队的任务需要一些时间,则三个线程很可能同时运行这三个任务。如果任务非常短并且系统上有一些负载使得在数据提交时只有一个线程空闲,那么一个线程可能会在另一个线程可用之前竞争并执行所有三个项目。如果核心比任务少,那么显然只有 [no. of cores] 任务可以同时运行。

混合搭配这些可能性。

于 2012-04-20T20:28:59.790 回答