处理java中的多个线程以向C服务器应用程序发送请求并获得响应

时间:2012-07-07 08:19:05

标签: java multithreading performance synchronization

我有一个传统的问题,多年来一直生活在java开发中,但无法确定最好的方法。所以需要你的建议来挑选最好的。问题如下 -

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

服务器 - 用C语言编写

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

代码设计 -

步骤1 - 逐行阅读文件

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

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

这可能会产生内存开销,因为您可以看到该文件是否包含100000条记录,它可能会创建100000条线程。你们能告诉我一个更好的办法吗?

谢谢,Sirish。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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