2016-09-21 9 views
0

Мне нужно прочитать все файлы .txt в папке с 4 потоками, запущенными одновременно. Что я могу сделать, чтобы каждый поток читал другой файл. Пример: Thread 1 читает файл 1, Thread 2 читает файл 2 ... и так далее, пока больше нет файлов для чтения.как читать разные файлы в differents runnable threads Java

Thread h; 


public Hilo(){ 
    h= new Thread(this,"Hilo 1"); 
    h.start(); 
} 

public void run(){ 
    int contador; 
    File folder = new File("C:/Users/Jose/Desktop/java"); 
    File[] listOfFiles = folder.listFiles(); 
    for (File file : listOfFiles) { 
     if (file.isFile()) { 
      contador=0; 
      int i=0; 
      //System.out.println(file.getName()); 
      Scanner scan = null; 
      try { 
       scan = new Scanner (file); 
      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      while (scan.hasNext()){ 
       String linea=scan.next(); 
       String[] lineas = linea.split("(?=[,.])|\\s+"); 
       if (Palindrome.is(lineas[i])){ 
        contador++; 
       } 
      } 
      scan.close(); 

     } 

    } 
} 
+0

'Executors' создает пул THEAD, вы можете использовать пул – passion

+0

вы можете быть более конкретным plz, im не ветеран в java? –

+0

@passion есть код –

ответ

0
package z; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class Test { 

    public static void main(String[] args) { 

    ExecutorService exec = Executors.newFixedThreadPool(4); 

    File folder = new File("C:/Users/Jose/Desktop/java"); 

    File[] files = folder.listFiles(); 

    for(File file : files){ 

     exec.execute(new Worker(file)); 
    } 

    } 
} 

class Worker implements Runnable { 

    private File file; 

    public Worker(File file) { 
    this.file = file; 
    } 

    @Override 
    public void run() { 
    int contador; 
    if (file.isFile()) { 
     contador = 0; 
     int i = 0; 
     Scanner scan = null; 
     try { 
     scan = new Scanner(file); 
     } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
     while (scan.hasNext()) { 
     String linea = scan.next(); 
     String[] lineas = linea.split("(?=[,.])|\\s+"); 
     if (Palindrome.is(lineas[i])) { 
      contador++; 
     } 
     } 
     scan.close(); 

    } 

    } 

} 
+0

@JoseAlbertoSantiagoLuna Я печатаю 'lineas', это нормально. – passion

0

Это код, без метода palindromo, его не necesary.

public class main { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Hilo numero1 = new Hilo(); 
     Hilo numero2 = new Hilo(); 
     Hilo numero3 = new Hilo(); 
     Hilo numero4 = new Hilo(); 
    } 
} 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 

public class Hilo implements Runnable { 

    Thread h; 

    public Hilo() { 
     h = new Thread(this, "Hilo 1"); 
     h.start(); 
    } 

    public void run() { 
     int c = 0; 
     int contador; 
     File folder = new File("C:/Users/Jose/Desktop/java"); 
     File[] listOfFiles = folder.listFiles(); 
     for (File file : listOfFiles) { 
      if (file.isFile()) { 
       contador = 0; 
       int i = 0; 
       //System.out.println(file.getName()); 
       Scanner scan = null; 
       try { 
        scan = new Scanner(file); 
       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       while (scan.hasNext()) { 
        String linea = scan.next(); 
        String[] lineas = linea.split("(?=[,.])|\\s+"); 
        if (Palindromo.es(lineas[i])) { 
         contador++; 
        } 
        c++; 
       } 
       scan.close(); 
       System.out.println("La cantidad de Palindromos en el archivo " + file + " es de: " + contador); 
      } 

     } 
    } 
} 
+0

Я отредактировал свой ответ ... – passion

+0

Да, работает ... но дело в том, что мне нужно, чтобы он читал разные файлы каждый. ваш код печатает exaccty, что делает моя, и мне нужно, чтобы она была 4 Threads одновременно с разными файлами. Спасибо и жаль беспокоить. –

+0

просто измените способ создания пула потоков .... изменено. .. – passion

0

Попробуйте: 1. Создать класс ReadFiles:

public class ReadFiles { 

    public interface IEvents { 
     void onFile(File file); 
    } 
    int maxConcurrentThread = 5; 
    ThreadPoolExecutor pool = null; 

    volatile int countFiles = 0; 
    String folder = ""; 
    IEvents event = null; 

    public ReadFiles(String folder, int maxConcurrentThread) { 
     this.folder = folder; 
     this.maxConcurrentThread = maxConcurrentThread; 
    } 

    public void setEvent(IEvents event) { 
     this.event = event; 
    } 

    public void read() { 

     ThreadPoolExecutor pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(this.maxConcurrentThread); 

     File ffolder = new File(folder); 
     File[] listOfFiles = ffolder.listFiles(); 
     for (final File file : listOfFiles) { 
      if (file.isFile()) { 
       pool.execute(new Runnable() { 

        @Override 
        public void run() { 
         countFiles++; 
         event.onFile(file); 
        } 

       }); 
      } 
     } 

     pool.shutdown(); 
    } 

} 

Как использовать:

int maxConcurrentThread = 5; 
     ReadFiles read = new ReadFiles("C:/Users/Jose/Desktop/java", maxConcurrentThread); 
     read.setEvent(new ReadFiles.IEvents() { 

      @Override 
      public void onFile(File file) { 
       Scanner scan = null; 
       try { 
        scan = new Scanner(file); 
       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       while (scan.hasNext()) { 
        String linea = scan.next(); 
        String[] lineas = linea.split("(?=[,.])|\\s+"); 
        if (Palindrome.is(lineas[i])) { 
         contador++; 
        } 
       } 
       scan.close(); 
      } 
     }); 
     read.read(); 
+0

Удивительный ответ, я думаю, что это работает как советовало ... но это домашнее задание, и я хотел понять, слишком ли сложно спросить, можете ли вы объяснить мне или отправить мне ссылку, объясняющую ваш метод? Большое спасибо. –

+0

Привет, Хосе. Класс ReadFiles использует ThreadPoolExecutor, где вы устанавливаете максимальный поток во времени. в этом случае вы передаете maxConcurrentThread = 5. Если в вашей папке содержится 1000 файлов, не рекомендуется открывать 1000 потоков одновременно. вы можете установить пример 50 или 100 как maximimun. ThreadPoolExecutor ждет свободной емкости и позже выполнит оставшийся поток для каждого файла. Событие onFile fire для каждого файла, и вы можете читать все файлы. – toto

 Смежные вопросы

  • Нет связанных вопросов^_^