【问题标题】:Multi-Threaded Application - Help with some pseudo code!多线程应用程序 - 帮助一些伪代码!
【发布时间】:2010-04-15 23:25:37
【问题描述】:

我正在开发一个多线程应用程序,需要一些伪代码方面的帮助。为了使实现更简单,我将尝试用简单的术语/测试用例来解释。

这里是场景-

我有一个字符串数组列表(比如 100 个字符串)

我有一个 Reader 类,它读取字符串并将它们传递给一个将字符串打印到控制台的 Writer 类。现在它在单线程模型中运行。

我想让这个多线程,但具有以下功能 -

能够设置 MAX_READERS

能够设置 MAX_WRITERS

能够设置 BATCH_SIZE

所以基本上,代码应该实例化那么多 Readers 和 Writers 并并行完成工作。

任何伪代码都会真正帮助我继续前进!

【问题讨论】:

  • 数组是在开始时给出的,还是传入字符串的流?
  • 好吧,如果您使用来自java.util.concurrent 的东西,那将非常容易......但是既然您想要伪代码,我想您希望它在不使用它的情况下实现(出于学习目的?)?我不清楚你为什么有MAX_WRITERSBATCH_SIZE,因为如果你批量编写,最明显的实现是始终只有一个编写器。 (等待多个批次累积,然后在多个线程中执行这些操作似乎很奇怪)

标签: java multithreading concurrency


【解决方案1】:

这听起来像是典型的消费者-生产者问题。看看Wikipedia's article 吧。他们那里有很多伪代码。

【讨论】:

  • 你可能是对的!我猜它更像是多线程生产者/消费者模式!
【解决方案2】:

除了使用建议的producer-consumer pattern 之外,我建议您使用CopyOnWriteArrayList,这样您就可以对列表进行无锁读/写/迭代。由于您只处理几百个字符串,因此CopyOnWriteArrayList 可能不会有任何性能问题。

如果您关心性能,那么我实际上认为使用BlockingQueueConcurrentHashMap 可能会更好。它们将允许您最大化多线程应用程序的吞吐量。


推荐选项:
BlockingQueue 与多个生产者和消费者一起工作得很好,但当然它意味着数据处理顺序 (FIFO)。如果您对 FIFO 排序感到满意,那么您可能会发现 BlockingQueue 是一个更快、更强大的选项。


我认为维基百科的文章有足够的伪代码供您使用,但您也可以查看以下一些 SO 问题:
https://stackoverflow.com/search?q=java+producer+consumer

Java 生产者-消费者设计:
Producer/Consumer threads using a Queue
design of a Producer/Consumer app

【讨论】:

  • @Lirik:我个人觉得这很令人困惑。首先,您通常不想在典型的生产者/消费者模型中使用 CopyOnWriteArrayList(如果您生产很多,这不是一个好的选择)。此外,我认为尚不清楚为什么 ConcurrentHashMap 在这种情况下可能有用。我的意思是,是的,它在地图上表现不错,但你在哪里需要地图?
  • @Zwei,我建议 CopyOnWriteArrayList 的唯一原因是因为 OP 正在使用数组,并且 OP 表示数组中将有大约 100 个字符串。显然 BlockingQueue 将是生产者/消费者设计的更好选择,所以也许我应该强调我的答案的那部分。地图在很多情况下很有用,这里有一个例子:您的生产者经常更新固定数量的数据字段,而您只关心最新的更新(即高频市场数据)......队列可能会很糟糕这种情况下的选择。
  • @ZWei - 我在帖子中说我正在使用这个特定的例子来让事情更好地理解。需要复制的数据不需要是字符串...通常它的实际数据库...所以基本上读者会从数据库中读取数据集,而作者会将它们保存在不同的数据库中..
  • @HonorGod,我明白了。我仍然认为 List 通常在这里是一个糟糕的选择。我看到这是因为 OP 建议,但我会说在这里使用 CopyOnWriteArrayList 是错误的。特别是因为 CopyOnWriteArrayList 仅应仅在您很少写入列表时使用。由于多个编写器从源中获取数据,因此您通常希望对事物进行出队(队列非常适合)。这对于 List 来说非常麻烦,而对于 CopyOnWriteArrayList 来说效率非常低。每次删除/添加时,都必须复制整个 List ..
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 2011-03-28
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多