2015-02-21 2 views
-1

Я немного запутался в поведении каждой «задачи», которую я хочу выполнить, с моим пулом потоков. У меня есть задание для чтения данных из CSV-файла (строка за строкой), и мне нужно сделать это в многопоточном образом, чтобы можно увидеть ниже реализации до сих пор:Confused Java Threadpool и синхронные методы

public class CSVParser implements Runnable 
{ 
    private String m_csvFilePath = "C:/Users/Gabi/Desktop/HttpTrafficProject/CSVfile.csv"; 
    private BufferedReader m_bReader = null; 
    private String m_Line = ""; 
    private String m_CSVSplitBy = ","; 
    private String m_SrcIP = ""; 
    private String m_Host = ""; 
    private String m_Request = ""; 
    private String m_UserAgent = ""; 

    @Override 
    public synchronized void run() 
    { 
     try 
     { 
      m_bReader = new BufferedReader(new FileReader(this.m_csvFilePath)); 
      while((m_Line = m_bReader.readLine()) != null) 
      { 
       String[] str = m_Line.split(m_CSVSplitBy); 
       m_SrcIP = str[0]; 
       m_Host = str[1]; 
       m_Request = str[2]; 
       m_UserAgent = str[3]; 
       System.out.println(this.m_SrcIP +" " + this.m_Host); 
      } 
      System.out.println("Done"); 
     } 
     catch (FileNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

public class Main 
{ 

    public static void main(String[] args) throws InterruptedException 
    { 
     Runnable parser = new CSVParser(); 
     ExecutorService executor = Executors.newFixedThreadPool(3); 
     for(int i = 0 ; i < 5 ; i++) 
       { 
        executor.execute(parser); 
       } 

    } 

} 

Как я понял, исполнитель по к моему коду, у меня будет всегда 3 рабочих потока, каждый из которых выполнит 5 задач (исправьте меня, если я ошибаюсь).

Мой вопрос:

каждый поток, который считывает данные из CSV-файла будет считывать все данные, и только после окончания делать это другой поток начнет считывать данные из CSV?

+0

Каждый поток синхронизируется на себя. –

+0

Ваш вопрос немного неясен. Что вы ожидали, что произойдет, чего вы не ожидаете? Ваши потоки не собираются работать вместе из-за вашей синхронизации, но я не уверен, что об этом вы спрашиваете. – RealSkeptic

+0

Каждый поток делает что-то, читая из файла csv, и после того, как один поток заканчивает его, другой поток продолжает оставаться частью. Это все, что вы можете сделать, выбирая подходящего исполнителя. –

ответ

1

Пул потоков содержит несколько потоков (3 в вашем примере), работающих параллельно. Выбрав executor.execute(parser);, вы закажете пул потоков для выполнения своего Runnable (в вашем случае экземпляр CSVParser). Пул потоков будет делать это, когда у него есть свободный поток.

Вы хотите выполнить экземпляр 1 CSVParser 5 раз с пулом потоков, имеющим 3 потока. Это означает, что пул потоков запускает один и тот же экземпляр CSVParser три раза параллельно. В связи с оператором synchronized два потока будут заблокированы. Таким образом, у вас всегда будет заблокировано два потока ваших исполнителей (что не имеет никакого смысла).

Если вы удалите заявление synchronized, у вас появятся серьезные проблемы, потому что три потока обращаются к одному и тому же m_bReader параллельно.

Если вы хотите иметь три параллельно CVSParser вам необходимо выполнить различные CVSParser экземпляры:

public static void main(String[] args) throws InterruptedException 
{ 
    ExecutorService executor = Executors.newFixedThreadPool(3); 
    for(int i = 0 ; i < 5 ; i++) 
    { 
     // add 5 instances of CSVParser 
     executor.execute(new CSVParser()); 
    } 

}