非常に大きなArrayList
オブジェクトがあり、シングル スレッドでスムーズに実行されます。ただし、実行時間は要因です。
リストに 50 個の要素があり、3 つのスレッドがあるとします。
1 番目のスレッドで 0 から 15 を処理し、2 番目のスレッドで 16 から 31 を処理し、残りのプロセスを 3 番目のスレッドで処理したいと考えています。
出来ますか?
非常に大きなArrayList
オブジェクトがあり、シングル スレッドでスムーズに実行されます。ただし、実行時間は要因です。
リストに 50 個の要素があり、3 つのスレッドがあるとします。
1 番目のスレッドで 0 から 15 を処理し、2 番目のスレッドで 16 から 31 を処理し、残りのプロセスを 3 番目のスレッドで処理したいと考えています。
出来ますか?
技術的には可能ですが、お勧めできません:
固定パーティション分割には、ワーカー スレッドのワークロードが不均衡になるリスクがあります。計算の並列部分を完了するのにかかる時間は、各ワーカー スレッドの時間の最大値です。
これArrayList
は、特にスレッドが更新する必要がある場合に、競合のボトルネックになる可能性があります。
より良いアプローチは、すべてのワーカーが同じキューから作業を受け取るキューイング メカニズムを使用することです。これを実装する簡単な方法は、バインドさExecutorService
れたワーカー プールで を使用することです。(fork-join フレームワークも別の可能性ですが、タスク間に依存関係がある動的または再帰的なタスクにより適しています。)
あなたの場合、最適なのは、1 つのスレッドを使用して Excel ファイルから URL を読み取り、それを限られた容量の ArrayBlockingQueue に入れることです。URL を 1 つずつ受け取り、参照されているサイトをスクレイピングするいくつかの作業スレッドを開始します。サイトへのアクセス中に各作業をブロックする必要があり、スレッドプールはスレッドがブロックされたときに気に入らないため、標準のスレッドプールは役に立ちません。微調整が必要な唯一のパラメーターは、作業スレッドの数です。10、100、1000、10000 を試して、最速の構成を見つけてください。数千のスレッドでメモリが使い果たされているが、最適に達していない場合は、Netty などの NIO ライブラリに切り替えます。