-1

私は何年もの間Java開発に生きている伝統的な問題を抱えていますが、それを行うための最良の方法を決定することができませんでした。だから、最高のものを選ぶためにあなたのアドバイスが必要です。問題は以下のようになります-

クライアント-Javaプログラム(基本的にはWebベースのアプリケーション)

サーバー-Cで書かれた

要件-ユーザーは、100万レコード、たとえば50000レコードを含む可能性のあるファイルをアップロードします。各レコード(行)には、シリアルID、製品名、および顧客名があります。私のJavaプログラムはファイルを読み取り、ネットワーク経由でCアプリケーションにリクエストを送信する必要があります。このCサーバーアプリケーションはリクエストIDで応答し、Java(クライアント)ではこのリクエストIDを同期されたリストに保存する必要があり、以前に送信されたリクエストIDのステータスを確認するためにCサーバーアプリケーションにクエリを返す必要があります。また、サーバーは要求IDに対してWIP(進行中の作業)またはDONE(完了)のいずれかで応答します。Cサーバーアプリケーションの応答=DONEの場合、サーバーは応答とともにデータを送信し、WIPの場合、クライアントは5秒間隔で3回再試行する必要があります。

コードデザイン-

ステップ1-ファイルを1行ずつ読み取る

ステップ2-行を読み取った後、サーバーに要求を送信し、同期された配列リストに応答を格納するスレッドを開始します。

ステップ3-別のスレッドが同期リストを読み取り、リクエストステータスのクエリを開始し、Cサーバーアプリからの最終応答を保存します。

これにより、ファイルに100000レコードが含まれているかどうかを確認できるように、メモリオーバーヘッドが発生する可能性があり、100000スレッドが作成される可能性があります。皆さんは私にこれを処理するより良い方法を提案できますか?

ありがとう、シリッシュ。

4

2 に答える 2

1

簡単な解決策は、100000 スレッドを作成せずに、ExecutorService を使用することです (たとえば、すぐに使用できるものを使用しますExecutors)。

これにより、実行する並列ジョブの最大数を制御できます。

于 2012-07-07T08:26:17.837 に答える
0

いくつかの問題/質問/提案 -
A. ファイル内のレコードは相互に依存していますか? そうでない場合、おそらくファイルをファイルに分割し、各スレッドにステップ 1 を実行させることができます。
B. しないでください。各行を読み取った後にスレッドを開始します-スレッドプールを使用するか、「ジョブ」を実行するためにキューをリッスンするワーカースレッドを使用します-そのようなキューで読み取った各行をプッシュします。これにより、スレッドの開始時間を節約できます。
C. 可能であれば、別のデータ構造を持つことを検討します - 単一のリストではないかもしれません (繰り返しますが、行が互いに依存していない場合、これは可能です) - リストをロックしているときは、リスト全体をロックします。
単一のリストを操作する必要があり、行が互いに依存していない場合は、N 個のスレッドがリストから読み取り、ReaderWriterLock があることを検討してください。このように、N 個の読み取りスレッドが機能します (読み取りだけを実行する場合)。 、書き込みスレッドがリストを埋める間、読み取ったエントリを削除する責任はありません)。

于 2012-07-07T08:27:33.203 に答える