0

非常に大きなリスト (たとえば 9000 以上) のエントリに対して何らかの処理を行う必要があり、処理されたエントリを新しいリストに追加するシナリオがあります。これを行うために、マルチスレッドアプローチを採用しています。

次の 2 つの方法のうち、どちらがより効率的でしょうか。

  1. 各スレッドに個別のリスト オブジェクトを与え、すべてのスレッドからの結果を 1 つの最終的なリストに追加する必要があります。
  2. 同期リストを使用して、すべてのスレッドがこのリストに同時に追加できるようにする必要があります。
4

2 に答える 2

2

スレッドは、独立して動作できる場合に最適に機能します。各スレッドに独自の作業を与え、終了時に結果を収集することをお勧めします。

この例では、各スレッドが独立して動作します。

ExecutorService service = 
List<Work> workList = 
int blockSize = (workList.size() + threads -1)/threads;
List<Future<List<Results>>> futureResults = new ArrayList<>();
for(int i=0;i<threads;i++) {
    int start = i * blockSize;
    int end = Math.min(workList.size(), (i + 1) * blockSize);
    final List<Work> list2 = worksList.subList(start, end);
    futureResults.add(service.submit(new Callable<List<Results>>() {
        public List<Results> call() {
             return process(list2);
        }
     });
 }
 List<Results> results = new ArrayList<>();
 for(Future<List<Results>> future:futureResults) 
     results.addAll(future.get()); 
于 2012-07-18T16:14:18.483 に答える
1

スレッド化が解決策だと思うのはなぜですか。並行性が解決する問題を実際に挙げていないのですか?

物事の壮大な計画では、9000 エントリを処理することは多くありません。900 万のエントリがあり、各エントリの処理に 10 秒かかると言っていたら、それは別の話かもしれません。

それぞれの処理に非常に長い時間がかかり (比較的)、CPU バウンドでない限り (リモート マシンで何かを行うのを待機するなど)、この状況でのマルチスレッド化は不要なものしか提供しないと思います。複雑。

Queue処理時間が長い場合でも、スレッド化は共有データを意味します。提供した非常にまばらな漠然とした情報から、単純な非同期アプローチはおそらくfromでうまく機能するでしょうjava.util.concurrency

于 2012-07-18T16:19:39.760 に答える