私は 'someObject'でいっぱいのArrayListを持っています。私は4つのスレッド(Futures & Callablesを使って)を使って、このリストを繰り返し処理する必要があります。スレッドは、それが渡る上位5つの値を持つオブジェクトを保持します。最初に並列ストリームを作成しようとしましたが、うまくいきませんでした。私は考えていないいくつかの明白なことは、各スレッドは、おそらく同じオブジェクトを2回つかむことなく、オブジェクトを反復することができますか?Javaで重複しないで単一のリストを並行して反復する
1
A
答えて
1
あなたは、リストを反復するためにAtomicIntegerを使用することができます。
class MyRunnable implements Runnable {
final List<SomeObject> list;
final AtomicInteger counter; // initialize to 0
public void run() {
while(true) {
int index = counter.getAndIncrement();
if(index < list.size()) {
do something with list.get(index);
} else {
return;
}
}
}
}
限り、各MyRunnable
が同じAtomicInteger
参照を持っているとして、彼らはあなたがAtomicInteger
またはいずれかを必要としないインデックス
1
を複製しません。その点については他の同期が必要です。
処理スレッドの数に基づいて(その数は前もって知られています)論理的にパーティションを分割し、それぞれが[from、to]のセクションで動作するようにするだけですリスト。
これは常に(安全である限り)常に努力すべきことである(たとえそれがAtomicInteger
のような最適化されたものであっても)同期の必要性を回避します。
擬似コード(リストのコピーを含まない本当にすべての溶液)AtomicInteger
ソリューション、このソリューションはまた、あなたがそれを手渡した後、あなたがのリストを変更しないことを前提としてと同様に
class Worker<T> implements Runnable {
final List<T> toProcess;
protected Worker(List<T> list, int fromInc, int toExcl){
// note this does not allow passing an empty list or specifying an empty work section but you can relax that if you wish
// this also implicitly checks the list for null
Preconditions.checkArgument(fromInc >= 0 && fromInc < list.size());
Preconditions.checkArgument(toExcl > 0 && fromInc <= list.size());
// note: this does not create a copy, but only a view so it's very cheap
toProcess = list.subList(fromInc, toExcl);
}
@Override
public final void run() {
for(final T t : toProcess) {
process(t);
}
}
protected abstract process(T t);
}
各スレッドにオフフックし、処理が開始されました。処理中にリストを変更すると、未定義の動作になります。
関連する問題
- 1. jspでリストを反復して単一のメッセージを構築する
- 2. ウェブスクレイピングでリストを反復しない
- 3. リストを反復して単一の変数(文字列)を作成する
- 4. Javaのリストのリストを反復する
- 5. リストから単一オブジェクトへの反復値を保存する
- 6. リストのリストを反復して値を後で修正する
- 7. コミットの単一ファイルで単一行でgitを復帰する
- 8. Javaオブジェクトのリストを通して反復する
- 9. 反復でクリックして反復する
- 10. javascriptでリストを反復できない
- 11. Groovyでループ反復を並行して実行しようとしています - エラーが発生する
- 12. 複数のリストを反復して比較する
- 13. 単一リンクリストでの単純な再帰的反復処理JavaScript
- 14. Javaのリスト反復子
- 15. Javaの階層を超える単一反復8
- 16. Pythonのリストでペアを反復処理し、反復
- 17. コレクションを使用して一意の重複単語を検索するJava
- 18. リストのリストを反復しています... TypeError: 'float'型の引数が反復不可能です
- 19. CSS:重複していない縦リスト
- 20. リスト内で反復しようとしています。
- 21. リスト内のJava 8反復リストとstream.map()
- 22. Postman(またはNewman)コレクションのランナー反復を並行して実行する
- 23. Java配列内の反復しない一致するペアを数える
- 24. ItemsSourceはコレクションを反復するのではなく、単一のアイテムとして扱いますか?
- 25. pythonセレンを使用して単一ループで複数の要素を反復する方法
- 26. リスト上でremoveAllを試行しているときにConcurrentModificationExceptionが発生する(反復処理ではない)
- 27. txtファイルのディレクトリを反復し、出力を単一のリストとして出力します。
- 28. Javaの配列リストを正しく反復する
- 29. Javaでリストに重複する用語を取得しています
- 30. Pythonでリストの一部のみを反復する
私はこの問題に従っていますが、おそらくオブジェクトを4つのサブリストに分割しています(スレッドごとに1つずつ)。 – Gavin