2010-04-14 61 views
1

我正在研究一个多线程应用程序,并需要一些伪代码的帮助。为了简化实现,我将尝试用简单的术语/测试用例来解释它。多线程应用程序 - 帮助一些伪代码!

下面是这种情况 -

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

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

我想使这个多线程,但具有以下特点 -

能够设置MAX_READERS

能够设置MAX_WRITERS

能够设置BATCH_SIZE

所以基本上代码应该实例化那些许多读者和作家,并行地完成这项工作。

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

+0

数组是在开始时给出的,还是它是一个传入字符串流? – Yuval 2010-04-14 19:07:17

+0

好吧,如果你使用'java.util.concurrent'中的东西,它将会非常容易...但是既然你想要伪代码,我想你希望它不使用它(用于学习目的?)? 我不清楚为什么你有'MAX_WRITERS'和'BATCH_SIZE',因为如果你批量编写,最明显的实现将是总是有一个单一的作家。 (等待多个批次积累,然后在多个线程中做这些似乎很奇怪) – 2010-04-14 20:41:11

回答

3

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

+0

你可能是对的!我想这更像是多线程的生产者/消费者模式! – jagamot 2010-04-14 18:58:36

0

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

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


推荐的选项:
一个BlockingQueue作品非常好,多个生产者和消费者,当然,这意味着数据处理(FIFO)的顺序。如果您可以使用FIFO排序,那么您可能会发现BlockingQueue是更快,更强大的选项。


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

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

+0

@Lirik:我个人觉得这很混乱。首先,你通常不想在典型的生产者/消费者模型中使用CopyOnWriteArrayList(如果你生产很多,这不是一个好的选择)。另外我认为目前还不清楚为什么在这种情况下ConcurrentHashMap可能会有用。我的意思是,它对地图有好处,但你需要一张地图在哪里? – 2010-04-14 22:34:47

+0

@Zwei,我提出CopyOnWriteArrayList的唯一原因是因为OP正在使用一个数组,并且OP声明数组中会有大约100个字符串。很显然,BlockingQueue对于生产者/消费者设计来说是更好的选择,所以也许我应该强调我的答案的一部分。 有很多情况下地图是有用的,这里有一个例子:你的制片人经常更新一个固定的数字字段,你只关心最新的更新(即高频率的市场数据)......一个队列可能会在这种情况下是不好的选择。 – Kiril 2010-04-14 23:58:12

+0

@ZWei - 我在帖子中说过,我正在使用这个特殊的例子来让事情更好理解。需要复制的数据不一定是字符串......一般来说它的数据库......所以基本上读者会从数据库中读取数据集,作家将把它们保存在不同的数据库中.. – jagamot 2010-04-15 11:55:37