2012-12-27 1 views
1

В следующей программе я вставивПочему объект становится нулевым, когда доступ из нити

значение

файлы [я] .lastModified() в allFiles HashMap в классе RThread

, когда я попытался извлечь значение lastModified из allFiles HashMap в основном классе, значение будет равно null. Поэтому вместо lastModified значения я поместил объект File непосредственно в HashMpa, тогда он сработал.

Любое руководство меня представляет концепцию этого. Метод

import java.io.File; 
import java.util.ArrayList; 
import java.util.Comparator; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import java.util.TreeMap; 
import java.util.concurrent.ConcurrentHashMap; 

public class RCFLister { 

    ConcurrentHashMap allFiles = new ConcurrentHashMap(); 

    String fileType = null; 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     RCFLister rcFileLister = new RCFLister(); 
     rcFileLister.recentFiles(args); 
    } 

    public void recentFiles(String[] args) { 

     int days = 1; 
     ThreadGroup rootthreadGr = new ThreadGroup("rootsThreadGroup"); 
     // reading number of days 
     if (args.length > 0 && args[0] != null) { 
      days = Integer.valueOf(args[0]); 
     } 
     // reading file type 
     if (args.length > 0 && args[0] != null) { 
      fileType = args[1]; 
     } 
     fileType = "png"; 
     // fileextFilter = new FileExtensionFilter(fileType); 
     File[] roots = File.listRoots(); 
     List threads = new ArrayList(); 
     for (int i = 0; i < roots.length; i++) { 
      // System.out.println(roots[i].getAbsolutePath()); 
      // rfThread = null; 

      RThread rfThread = new RThread(roots[i]); 
      Thread t = new Thread(rfThread); 
      t.start(); 
      threads.add(t); 
     } 

     for (int i = 0; i < threads.size(); i++) { 
      try { 
       ((Thread) threads.get(i)).join(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     ValueComparator vc = new ValueComparator(allFiles); 
     TreeMap sortedMap = new TreeMap(vc); 
     sortedMap.putAll(allFiles); 
     System.out.println(sortedMap.size()); 
     Iterator it = sortedMap.keySet().iterator(); 
     while (it.hasNext()) { 
      Object key = it.next(); 
      System.out.println(key + " " + sortedMap.get(key)); 
     } 
    } 

    private class ValueComparator implements Comparator { 

     Map allFiles; 

     public ValueComparator(Map allFiles) { 
      this.allFiles = allFiles; 
     } 

     public int compare(Object o1, Object o2) { 
      if (((Long) allFiles.get(o1)) >= ((Long) allFiles.get(o2))) { 
       return -1; 
      } else { 
       return 1; 
      } 
     } 
    } 

    private class RThread implements Runnable { 
     File rootFolder; 



     RThread(File root) { 
      rootFolder = root;   
     } 

     public void run() { 
      getFiles(rootFolder); 

     } 

     public void getFiles(File folder) { 
      File[] files = folder.listFiles(); 
      for (int i = 0; files != null && i < files.length; i++) { 
       // System.out.println(files[i].getAbsolutePath()); 
       if (files[i].isDirectory()) { 
        getFiles(files[i]); 
       } else if (fileType == null 
         || (fileType != null && files[i].getName().endsWith(
           fileType))) { 
        String filename = null; 
        try { 
         filename = files[i].getCanonicalPath(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
               if(files[i].lastModified()!=0) 
        allFiles.put(filename, files[i].lastModified()); 
       } 
      } 
     } 

    } 

} 
+0

Ваш вопрос непонятен? как и где вы проверяете, что файлы [i] .lastModified() имеют значение null? Я попытался распечатать карту, и они не являются нулевыми. –

+0

Пожалуйста, используйте дженерики при работе с картами. Java 5 выпущена более 8 лет назад. –

+0

внутри RThread значение не является нулевым, но вне потока оно равно null, когда я читаю основной класс System.out.println (key + "" + sortedMap.get (key)); – learner

ответ

0

сравнить() из ValueComparator никогда не возвращает 0. Возвращение 0 означает равенство, который отсутствует, так что даже если ключ присутствует не найдено. Также ключевым является String (имя файла), и вы сравниваете его по значению (long). Необходимо переосмыслить, как вы хотите хранить данные. Просто убедитесь, что это только проблема, напечатайте CocurrentHashMap.

Использовать Generic, он выглядит утомительным с самого начала, но на самом деле не так уж плохо. Это поможет компилировать код без предупреждения и обеспечить безопасность типа.

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