我需要使用 java 多线程读取批量数据文件并处理数据(如数据验证、跟踪验证失败和插入数据库等)。
我想使用主线程从文件中读取数据并使用多标题和 ExecutorService 处理数据。
一旦对数据库进行验证和插入,我需要跟踪每条记录输出。
我的问题是:
- 如何跟踪每条记录的输出?
- 我可以放置一个公共变量并增加故障记录数据的数量吗?
- 我需要跟踪有多少记录按顺序失败。可能吗?
我需要使用 java 多线程读取批量数据文件并处理数据(如数据验证、跟踪验证失败和插入数据库等)。
我想使用主线程从文件中读取数据并使用多标题和 ExecutorService 处理数据。
一旦对数据库进行验证和插入,我需要跟踪每条记录输出。
我的问题是:
- 如何跟踪每条记录的输出?
- 我可以放置一个公共变量并增加故障记录数据的数量吗?
正如@JBNizet 提到的,您可以将 anAtomicInteger
用于成功和失败计数。类似于以下内容:
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();
}
}
}
我需要跟踪有多少记录按顺序失败。可能吗?
您可以做到这一点的一种方法是在每一行上都有一个事务编号并保存最后一个失败的事务编号。然后,如果当前失败的事务编号不是 ,则您可以将失败计为顺序失败或重置顺序计数器(last+1)
。
if (worked) {
lastFailedTransactionNumber = 0;
sequentialFailureCount = 0;
} else {
if (transactionNumber == lastFailedTransactionNumber + 1) {
sequentialFailureCount++;
... maybe log it or something?
}
lastFailedTransactionNumber = transactionNumber;
}
您可以将唯一的实例传递AtomicInteger
给每个验证任务,并在AtomicInteger
每次发生故障时让任务递增。AtomicInteger 是线程安全的,因此这样做不会有任何并发问题。
关于每条记录的输出,您只需要将输出添加到线程安全集合(例如,aCollections.synchronizedList()
或 ConcurrentLinkedQueue)。