4

Java で並行処理を使用して、オンライン API への要求を作成し、応答ドキュメントをダウンロードして解析し、結果のデータをデータベースにロードしたいと考えています。

各スレッドが要求、解析、ロードするスレッドのプールを 1 つ持つのは標準ですか? つまり、 を実装するクラスは 1 つだけRunnableです。それとも、たとえば、スレッドの 3 つの異なるプールを用意して、最初のスレッドのプールが要求を作成してキューにプッシュし、2 番目のスレッドのプールが最初のキューからポーリングし、解析し、解析されたデータをプッシュする方が効率的ですか? 2 番目のキューに移動し、最後に 3 番目のプールが 2 番目のキューからデータをポーリングしてデータベースにロードしますか? この場合、 を実装する 3 つの異なるクラスを作成しますRunnable

4

3 に答える 3

8

処理のどの部分が並列処理の恩恵を受けるかを検討する必要があります。ソケットとネットワーク待機が関係するため、オンライン API 通信が最も可能性が高い候補です。DB インタラクションも同様です。マルチスレッド解析は、使用可能なCPU コアが複数ある場合にのみパフォーマンスが向上する可能性があります。

プロセス全体を 3 つの別々のクラスに分割すると、結束力が確実に高まります。つまり、各クラスの責任が軽減されます。これは良いことです。一方、これらのクラスをそれぞれ aRunnableにして複数のキューを持つと、アプリケーションが (不必要に) 複雑になります。

3 つの個別のクラスを作成することをお勧めしますが、作成しないでくださいRunnable。次に、1 つのスレッド プールである 3 つのクラスを作成Runnableしますcontainsorchestratesこれが十分に高速ではないことがわかった場合 (およびいくつかのプロファイリングの後で)、ランナブルを 2 つのスレッド プール (ダウンロードと解析、および db アクセス) に分割してみてください。

ポイントは、単純なものから始めて、必要に応じて複雑さを加えることです。

于 2012-09-10T14:14:18.297 に答える
2

考慮すべき 1 つの重要な点:処理の順序は重要ですか? つまり、最初のダウンロード リクエストの解析結果が2 番目のリクエストの結果よりに DB にロードされることは重要ですか?

その場合、タスクごとに 1 つのキュー (または同様のもの) が本当に必要です。実際には、3 つのシングルスレッド スレッド「プール」 (または ExecutorService を使用) です。

そうでない場合は、@Brady が良い点を指摘します。彼とは異なり、私はおそらく 3 つのクラスすべてを作成しRunnableますが、それは 3 つのキューを使用する必要があるという意味ではなく、単一のプールとプロファイルを試して、それがどのように機能するかを確認することもできます。

于 2012-09-10T14:54:48.697 に答える