-1

我有一个在 java 开发中存在多年的传统问题,但无法决定什么是最好的方法。所以需要你的建议来选择最好的。问题如下 -

客户端 - Java 程序(基本上是基于 Web 的应用程序)

服务器 - 用 C 编写

要求 - 用户将上传一个可能包含一百万条记录或例如 50000 条记录的文件。每条记录(行)都有一个序列号、产品名称和客户名称。我的 java 程序应该读取文件并通过网络向 C 应用程序发送请求。此 C 服务器应用程序将使用请求 ID 进行响应,并且在 java(客户端)中,我需要将此请求 ID 存储在同步的列表中,并应查询回 C 服务器应用程序以找出之前发送的请求 ID 的状态. 服务器响应请求 ID 的 WIP(正在进行的工作)或 DONE(已完成)。如果 C 服务器应用程序响应 = DONE,服务器将连同响应一起发送一些数据,如果它的 WIP,客户端应该以 5 秒的间隔重试 3 次。

代码设计 -

第 1 步 - 逐行读取文件

第 2 步 - 读取该行后,启动一个线程,该线程将向服务器发送请求并将响应存储到同步数组列表中。

第 3 步 - 另一个线程将读取同步列表并开始查询请求状态并存储来自 C 服务器应用程序的最终响应。

这可能会产生内存开销,因为您可以看到如果文件包含 100000 条记录,它可能会创建 100000 个线程。你们能建议我一个更好的方法来处理这个问题吗?

谢谢,西里什。

4

2 回答 2

1

简单的解决方案是:不要创建 100000 个线程,而是使用 ExecutorService(例如,使用其中一个可以使用的 from Executors)。

这样您就可以控制要执行的最大并行作业数。

于 2012-07-07T08:26:17.837 回答
0

几个问题/问题/建议 -
A. 文件中的记录是否相互依赖 - 如果不是,您可以做的可能是将文件拆分为文件,并让每个线程执行步骤 1。
B. 不要在读取每一行后启动线程 - 使用线程池和/或让工作线程侦听队列以查找“作业” - 将您读取的每一行推送到这样的队列中。这将为您节省线程开始时间。
C. 如果可能的话,我会考虑使用不同的数据结构 - 也许不仅仅是单个列表(再一次,如果行不相互依赖,这是可能的) - 请注意,当你锁定列表时,你是锁定整个列表。
如果您确实想使用单个列表,并且这些行不相互依赖 - 考虑让 N 个线程从列表中读取,并有一个 ReaderWriterLock - 这样,N 个读取线程可以工作(如果它们执行只是读取,并且不负责删除他们读取的条目),而作者线程填充列表。

于 2012-07-07T08:27:33.203 回答