当从线程访问时,为什么对象变为null

时间:2012-12-27 09:47:06

标签: java multithreading

在以下程序中我插入

  RTFread类中的allFiles HashMap中的

files [i] .lastModified()值

当我尝试从主类中的allFiles HashMap中检索lastModified的值时,该值将变为null。因此,我将File对象直接放在HashMpa中,而不是lastModified值,然后就可以了。

任何人都会指导我背后的概念。

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());
                }
            }
        }

    }

}

1 个答案:

答案 0 :(得分:0)

ValueComparator的compare()方法永远不会返回0.返回0表示缺少相等性,因此即使存在键也找不到它。 键也是String(文件名),您按值(长)进行比较。需要重新考虑如何存储数据。 只是为了确保它只是问题,打印CocurrentHashMap。

使用Generic,它在开始时看起来很乏味,但实际上并没有那么糟糕。它将有助于编译代码而不会发出警告并实现类型安全。