2012-04-20 82 views
0

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

回答

1

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

的几点

  • 如果您产卵三个线程,它们每一个循环,阅读过相同的队列,然后将他们全部尝试使用队列中的项目。没有保证每个线程将消耗多少项目。这完全取决于JVM中的线程调度程序(或OS级别)。一般来说,如果大量相似的项目被添加到队列中,每个线程将消耗大致相同数量的项目。

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

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

0

通常情况下,你要使用同步的线程到每个线程读取1个输入。

要回答你的问题,无法确定在这种情况下的行为。你应该强制你的线程同步,以确保每个线程在任何时候都很忙,而不仅仅是一个。

0

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

从arrayqueue的文档: 他们不是线程安全的;在不存在外部同步的,它们不支持由多个线程

0

假设arrayqueue压入/弹出是线程安全和并发访问所使用不限制运行的线程的数目的任何信令:

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

混合并匹配那些可能性。