現在、ExecutorService を使用して CopyOnWrite ArrayLists で文字列のバッチを並列処理するために送信しています。これらのリストを処理する Runnable タスクは、リストを反復処理し、各文字列で処理を行う必要があります。
通常の ArrayLists との同時実行の問題に遭遇した後、スレッドセーフであるため CopyOnWriteArrayLists を使用しようとしましたが、結果に一貫性がなくなりました。つまり、プログラムを実行するたびに異なる結果が得られます。これは、各 Runnable タスクが完全に反復される前に、arraylist の内容が何らかの方法で変更されたことを示唆しています。
public static class BatchRunnable implements Runnable {
private CopyOnWriteArrayList<String> batch;
BatchRunnable(CopyOnWriteArrayList<String> batch){
this.batch = batch;
}
@Override
public void run(){
//iterate over batch and work with String elements
//make no modifications to batch
}
}
実行可能なタスクは、配列リストに変更を加えず、リストを反復処理するだけで、リストの文字列要素を使用して処理を行います。
CopyOnWriteArrayList が変更される唯一の場所は、新しい Runnable タスクごとにインスタンス化されるときです。
バッチ処理の代わりに単一の文字列を渡していたとき、一貫性のある正しい結果が得られましたが、文字列 ArrayLists でバッチを使用し始めたとき、一貫性のない結果が得られました。安全。
どんな助けでも大歓迎です、ありがとう!
編集:これが私のバッチが構築されている場所です:
Runnable worker = null;
while((line = br.readLine()) != null) {
recordBatch.add(line);
if(recordBatch.size() == 100){
worker = new BatchRunnable(recordBatch);
executor.execute(worker);
recordBatch.clear();
}
}
executor.shutdown();
executor.awaitTermination(60,TimeUnit.SECONDS);