2017-05-27 1 views
-1

J'ai un fichier CSV qui contient 10000 lignes. Je veux lire le fichier en utilisant N threads en veillant à ce qu'une ligne particulière est lue une seule fois. Par exemple. Si Thread-0 lit la ligne numéro 1, aucun autre thread ne doit relire cette ligne particulière et simultanément les autres threads traitent les lignes restantes. La tâche est que chaque ligne ne doit être traitée qu'une seule fois.Lire une ligne une seule fois en utilisant le multithreading

Pouvons-nous mettre en œuvre cette approche. Exemple de code serait vraiment apprécié. Merci beaucoup!

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

Nous pourrions. Mais nous refusons généralement de le faire sur une entrée comme celle-ci - comme vous ne montrez aucun effort que vous avez essayé de résoudre vous-même. Nous ne faisons pas vos devoirs pour vous, vous savez. – GhostCat

+0

@GhostCat Veuillez trouver l'exemple de code. –

+0

A) ne jamais aller avec des blocs de catch vides B) ce que vous demandez n'a simplement pas beaucoup de sens: un lecteur ne propose que des méthodes de lecture. Donc, votre idée d'avoir plusieurs threads travaillant avec le même lecteur n'ajoute aucune valeur, bien au contraire - cela rend les choses beaucoup plus compliquées que nécessaire. Au lieu de cela: lisez d'abord toutes les lignes dans une liste, puis faites en sorte que chaque processus thread fasse partie de cette liste. Et pour le compte rendu: vous avez perdu environ 10% de la solution, on dirait que vous voulez que nous réfléchissions pour vous. – GhostCat

Répondre

0

Une solution possible est de planifier vos threads de lire un morceau constant de données (nombre de caractères) du fichier, ce qui signifie que chaque thread serait responsable de la lecture du nombre de caractères. De cette façon, nous aurions besoin d'enregistrer le dernier caractère lu quelque part, de sorte que lorsqu'un nouveau thread arrive dans le fichier, il sache exactement où et combien de caractères lire (startCharacterIndex + taille de bloc).

Ce mécanisme pour enregistrer le dernier caractère de hit et le partager entre tous les threads, peut être accompli en utilisant les variables volatile dans java.

Volatile Les valeurs sont partagées entre les threads et leurs valeurs ne sont jamais mises en cache localement, donc chaque mise à jour de leur valeur met à jour la référence réelle et vous n'avez pas besoin de vous inquiéter des anciennes lectures.

public static volatile int lastReadCharIndex = 0 ; 

En outre, vous pouvez obtenir les mêmes résultats avec les objets AtomicReference, sur lequel tous lu/écrit sont faites atomiquement et la valeur restera toujours cohérente