0

У меня есть метод, который принимает число потоков для работы, а затем выполняет метод Run() для каждого потока, соответственно, как показано нижеметод возвращает перед выполнением всех тема, несмотря на то, executor.awaitTermination используются

public static Map<String, Integer> execute(int thread_count) { 
     ExecutorService executor = Executors.newFixedThreadPool(thread_count); 
     File folder = new File("logFiles/");  
     Collection<File> files = FileUtils.listFiles(folder, null, true);  
     for(File file : files){ 
      //For rach file in folder execute run() 
      System.out.println(file.getName()); 
      executor.submit(new Runner((file.getAbsolutePath()))); 
     } 
     executor.shutdown(); 
     try { 
      executor.awaitTermination(1, TimeUnit.DAYS); 
     } catch (InterruptedException e) { 
      System.out.println("Exception "+ e + " in CountLines.execute()"); 
     } 
     for(Map.Entry<String, Integer> entry: Runner.lineCountMap.entrySet()){ 
      System.out.println(entry.getKey() + " : : " + entry.getValue()); 
     } 
     return Runner.lineCountMap;// printing after all the threads finish executing 
    } 

И метод запуска определяется следующим образом:

public void run() { 
     try { 
      count = countLines(file);//get number of lines in file 
     } catch (IOException e) { 
      System.out.println("Exception "+ e + " in Runner.run()"); 
     } 
     //count number of lines in each file and add to map 
     lineCountMap.put(file, count); 
    } 

Как я использовал executor.awaitTermination в Execute() метод выше, я ожидал мой lineCountMap быть заполнен всеми filesnames как ключ и подсчет строк в качестве значений. Но кажется, что lineCountMap возвращается до того, как будут выполнены все потоки.

For the following files: 
    logtest.2014­-07-­04.log 
    logtest.2014­-07-­02.log 
    logtest.2014­-07-­01.log 
    logtest.2014­-07-­03.log 

Expected Output: 

lineCountMap: 
/logtest.2014­-07-­01.log : : 4 
/logtest.2014­-07-­02.log : : 8 
/logtest.2014­-07-­03.log : : 2 
/logtest.2014­-07-­04.log : : 1 

Actual Output: 

lineCountMap: 
/logtest.2014­-07-­01.log : : 4 
/logtest.2014­-07-­03.log : : 2 
/logtest.2014­-07-­04.log : : 0 

Вот мне не хватает контента для /logtest.2014-07-02.log, а также значение для /logtest.2014-07-04.log показано 0, когда он 1

+1

Является ли 'lineCountMap'' ConcurrentHashMap' (например, он должен быть доступен одновременно несколькими потоками ...) или простой 'java.util.HashMap'? –

+0

Привет @OlivierCroisier это простой 'java.util.HashMap'. Каждый поток обращается к независимому ключу в 'lineCountMap', поэтому мне нужна моя карта, чтобы быть параллельной? –

+0

Да, вы все еще делаете для правильной публикации данных в памяти. Измените свой 'HashMap' на' ConcurrentHashMap' и снова проверьте. –

ответ

0

Изменение lineCountMap до ConcurrentHashMap решило проблему. Благодаря Oliver Croisier для решения, как описано в разделе комментариев.