0

Javaマルチスレッドを使用して、バルクデータファイルを読み取り、データを処理する必要があります(データの検証、検証の失敗の追跡、データベースへの挿入など)。

メインスレッドを使用してファイルからデータを読み取り、マルチスレッドと ExecutorService を使用してデータを処理したいと考えていました。

データベースに対して検証と挿入が行われると、すべてのレコード出力を追跡する必要があります。

私の質問は次のとおりです。

  • すべてのレコードの出力を追跡するにはどうすればよいですか?
  • 共通変数を 1 つ入れて、故障記録データの数を増やすことはできますか?
  • 連続して失敗したレコードの数を追跡する必要があります。出来ますか?
4

2 に答える 2

3
  • すべてのレコードの出力を追跡するにはどうすればよいですか?
  • 共通変数を 1 つ入れて、故障記録データの数を増やすことはできますか?

@JBNizet が述べたように、AtomicInteger成功カウントと失敗カウントの両方に使用できます。次のようなもの:

  private final AtomicInteger successCounter = new AtomicInteger(0);
  private final AtomicInteger failureCounter = new AtomicInteger(0);
  ...
  threadPool.submit(new MyRunnable(successCounter, failureCounter));
  ...
  public class MyRunnable {
     private AtomicInteger successCounter;
     private AtomicInteger failureCounter;
     public MyRunnable(AtomicInteger successCounter, AtomicInteger failureCounter) {
        this.successCounter = successCounter;
        this.failureCounter = failureCounter;
     }
     public run() {
        ...
        if (worked) {
           successCounter.incrementAndGet();
        } else {
           failureCounter.incrementAndGet();
        }
     }
  }

連続して失敗したレコードの数を追跡する必要があります。出来ますか?

これを行う 1 つの方法は、各行にトランザクション番号を付けて、最後に失敗したトランザクション番号を保存することです。次に、失敗をシーケンシャルとしてカウントするか、現在の失敗したトランザクション数がそうでない場合はシーケンシャル カウンターをリセットすることができます(last+1)

  if (worked) {
     lastFailedTransactionNumber = 0;
     sequentialFailureCount = 0;
  } else {
     if (transactionNumber == lastFailedTransactionNumber + 1) {
        sequentialFailureCount++;
        ... maybe log it or something?
     }
     lastFailedTransactionNumber = transactionNumber;
  }
于 2012-05-25T11:04:01.537 に答える
2

の一意のインスタンスAtomicIntegerをすべての検証タスクに渡しAtomicInteger、失敗が発生するたびにタスクをインクリメントすることができます。AtomicInteger はスレッド セーフであるため、これを実行しても同時実行性の問題は発生しません。

すべてのレコードの出力に関しては、出力をスレッド セーフなコレクション (Collections.synchronizedList()たとえば、または ConcurrentLinkedQueue など) に追加するだけです。

于 2012-05-25T10:49:08.713 に答える