我有一个包含10000行的CSV文件。我想使用N个线程读取文件,确保特定行只读一次。例如。如果Thread-0正在读取第1行,那么其他任何线程都不应再次读取该特定行,并且其他线程同时处理其余行。任务是每行只应处理一次。
我们可以实施这种方法吗?示例代码将非常感谢。 非常感谢!!
public class FileReaderThread implements Runnable {
@Override
public void run() {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("C://Users/mR.cOol/Desktop/Input.csv"));
String line = "";
try {
while ((line = br.readLine()) != null) {
synchronized (line) {
System.out.println("In Synchronized block" + " " + Thread.currentThread().getName());
String arr[] = line.split(",");
System.out.println(arr[0]);
}
}
} catch (IOException e) {
}
} catch (Exception e) {
}
}
}
public class MainClass {
private static final int workerThread = 2;
public static void main(String[] args) {
Thread thread[] = new Thread[workerThread];
for(int i=0;i<workerThread;i++) {
thread[i] = new Thread(new FileReaderThread());
thread[i].start();
}
}
}
答案 0 :(得分:0)
一个可行的解决方案是计划你的线程从文件中读取一个恒定的数据块(字符数),这意味着每个线程都负责读取多个字符。
通过这种方式,我们需要将最后一个读取字符保存在某处,这样当一个新线程进入该文件时,它确切地知道要读取的字符的位置和数量(startCharacterIndex + chunk-size)。
这种用于保存最后一个匹配字符并在所有线程之间共享它的机制可以通过在java中使用volatile
变量来完成。
Volatile
值在线程之间共享,它们的值永远不会在线程本地缓存,因此每次更新它们的值,更新实际引用,您不必担心旧的或脏的读取。< / p>
public static volatile int lastReadCharIndex = 0 ;
此外,您可以使用AtomicReference
对象获得相同的结果,所有读/写都以原子方式完成,并且值始终保持一致