2016-09-21 26 views
0

我需要讀取4個線程同時運行的文件夾中的所有.txt文件。我可以做什麼,以便每個線程讀取不同的文件。例如:線程1讀取文件1,線程2讀取文件2 ...等等,直到沒有更多文件可讀。如何在不同的可運行線程中讀取不同的文件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,即時通訊沒有在java的老將? –

+0

@激情有代碼 –

回答

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

是的,作品...但事情是,我需要它來讀取不同的文件。你的代碼打印出我的東西,我需要它是4個線程在同一時間與不同的文件。感謝和抱歉打擾。 –

+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爲每個文件啓動,並且您可以讀取所有文件。 – toto

相關問題