2017-05-27 49 views
-1

我有一个包含10000行的CSV文件。我想用N个线程读取文件,确保只读一次特定行。例如。如果线程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(); 
    } 
} 

}

+2

我们可以在同样的结果。但是我们通常拒绝这样做 - 就像你试图自己解决这个问题所做的努力一样。你知道,我们不为你做功课。 – GhostCat

+0

@GhostCat请找到示例代码。 –

+0

A)永远不要使用空的catch块B)你所要求的只是没有多大意义:读者只提供读取方法。所以你的想法是让多个线程与同一个阅读器一起工作并不会增加任何价值,相反 - 它使事情变得比需要的复杂得多。相反:首先将所有行读入列表中,然后让每个线程处理该列表的不同部分。为了记录:你下降了约10%的解决方案,它仍然看起来像你希望我们为你做的想法。 – GhostCat

回答

0

一个可行的解决方案就是计划你的线程从文件中读取数据(字符数)的恒定块,这意味着每个线程会负责阅读我的一些字符。

通过这种方式,我们需要将最后一个读取的字符保存到某个地方,这样当新的线程到达文件时,它就会确切知道要读取的字符的位置和数量(startCharacterIndex + chunk-size)。

这种机制可以通过在java中使用volatile变量来完成,它可以保存最后命中字符并在所有线程之间共享。

Volatile值在线程之间共享,并且它们的值永远不会在线程本地缓存,因此每更新一次它们的值,更新实际引用并且不需要担心旧的或脏的读取。

public static volatile int lastReadCharIndex = 0 ; 

另外,还可以实现与AtomicReference对象,在其所有的读/写操作都自动完成的和值将始终保持一致