有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用固定线程池和队列的多线程Java设计

我正在设计一个程序,需要从数据存储中获取结果,并将这些结果发布到另一个系统。我正在获取的数据由UUID引用,并由UUID链接到其他文档。我将发布大量文档(>;10万个文档),所以我想同时发布。我正在考虑以下设计:

从数据存储中获取文档列表。每份文件将包括:

docId (UUID)
docData (json doc)
type1 (UUID)
type1Data (json)
type2 (UUUID)
type2Data (json)
list<UUID> type3Ids
list of type3 data (json)

我从第一次通话中得到的唯一数据是docid。我想把这些文档推到一个队列中,让一组工作人员(取数器)对数据存储进行相关调用,以检索数据

retrieve the docData from datastore, fill in the type1, type2 and type3 UUIDS
do a batch get to retrieve all the type1, typ2 and type3 docs
Push the results into another queue for posting to other system

第二组工作人员(海报)将从scond队列中读取每个文档,并将结果发布到第二个系统

我有一个问题,我应该创建一个固定线程池(大小为X)还是两个固定线程池(大小为X/2)?如果第一个队列中有大量作业,以至于第二个队列在第一个队列为空之前无法启动,是否存在饥饿的危险

抓取器将通过网络连接与数据库进行通信,它们似乎更受IO约束,而不是CPU约束。这些海报也会进行网络通话,但它们与我的代码运行的VPC位于同一个云中,所以它们的距离相当近


共 (1) 个答案

  1. # 1 楼答案

    阻塞队列

    这是一种很正常的模式

    如果有两个不同的作业要做,请使用两个不同的线程池,并使其大小可配置,以便可以根据需要调整它们的大小/在部署服务器上测试不同的值

    通常使用大小有界的阻塞队列(^{}内置于Java 5及更高版本中)(例如,对于任意示例,1000个元素)

    阻塞队列是thread-safe,因此第一个线程池中的所有内容都以最快的速度写入,第二个线程池中的所有内容都以最快的速度读取。如果队列已满,则写操作将被阻塞,如果队列为空,则读操作将被阻塞——非常简单

    您可以调整线程数并反复运行,以缩小每个池的最佳配置大小