2011-10-10 67 views
1

我打算在几天内开始一个新项目,我想在设计要点上进行一些审查。我应该在Java多线程中使用哪种数据结构?

存在旧的遗留代码,它在内存数据库中使用散列表。有一个线程使用来自文件和套接字的xml提要并填充此散列表,另一个线程进行验证和更新,如果验证成功,则第三个线程将验证的数据保留在数据库中。由于在更新期间性能很差(意味着其他两个线程快速追赶并等待验证线程完成),我计划使用一个concurrenthashmap来为我的解决方案建立原型,并创建多个线程进行验证。我仍处于原型设计阶段,但希望得到一些关于我是否朝着正确方向前进的反馈。先谢谢你。

回答

1

我不认为并发哈希映射会帮助。我假设你在散列表中创建了多个条目,并且在验证后将它们存储在数据库中。问题是您的持久线程必须等待验证完成。

如果哈希表中的所有条目都是相互关联的,验证器必须检查所有条目 - 您可以做的事情不多,只能等待。但是,如果您可以分解小块中的验证(最简单的情况是条目根本不相关),那么您可以将验证与多个线程并行化,或者使用消费者/生产者模式来存储数据。也就是说,一旦验证程序完成一个块,它会将其发布到队列中,持久性线程将从队列中读取并存储该块。

如果必须检查所有条目,则可以将它们保存为块,但如果验证失败则回滚。

+0

散列表中的每个条目都是一个集合,它不需要根据散列表中的其他条目进行验证。他们是孤立的。每个记录的验证需要进行一些数据库调用,因此每个记录验证都需要时间。 –

+0

因此,消费者生产商将工作得很好。事实上,它甚至可能在所有三层中都有效。一个线程池可以从队列读取数据并对其进行验证,另一个线程池可以读取已验证的条目并将其保存在数据库中。配置这些线程池以匹配读者线程生成条目的速度。 –

+0

谢谢。我只是意识到这一点 - 我不认为我们将需要存储在一个hashmap中。我可以使用ArrayBlockingQueue来实现消费者/生产者吗?一旦从源读取数据(一旦我的数据被构建),我将发布到ArrayBlockingQueue中,然后消费者线程可以来验证并持久化验证的数据。这会工作吗? –

相关问题